Autor Beitrag
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.02.03 22:22 
mein Programm braucht nicht die höhste Priorität. Allerdings hab ich ein Überwachungstool mit dem ich auf bestimmte Ereignisse reagieren kann. Leider haben einige zu überwachende Programme eine so hohe Priorität, daß ich mit meinem Programm nicht oder nur schwer reagieren kann.

Wie kann ich also meinem Programm eine sehr hohe Priorität zuweisen. Sie soll nicht permanent hoch sein, sondern bei Bedarf zuschaltbar sein.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.02.03 22:33 
SetPriorityClass.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 13.02.03 00:07 
Funktioniert das so wie ich es glaube, z.B.:
ausblenden Quelltext
1:
SetPriorityClass(Application.Handle, THREAD_PRIORITY_BELOW_NORMAL);					

Reicht das? Ober arbeitet SetPriorityClass mit andern Funktionen. Hast du Erfahrungswerte wie hoch ich gehen kann ohne das ich systemwichtige Prozesse blockiere?

Moderiert von user profile iconTino: Code-Tags hinzugefügt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.02.03 00:33 
Der erste Parameter ist nicht der Anwendungs-Handle, sondern der Prozess-Handle. Das heißt du mußt dir mit CreateToolHelp32Snapshot erst die ProzessID holen und dann mit OpenProcess und PROCESS_QUREY_INFORMATION das Prozess-Handle holen. Siehe dazu auch meine Prozess-Betrachter von meiner Seite.

Mit Erfahrungswerten kann ich nicht dienen. Ich würde nur REALTIME_PRIORITY_CLASS das vermeiden. Desweiteren entscheidet letztendlich Windows, wie viel CPU-Zeit dein Prozess bekommt. Les dazu auch mal hier: msdn.microsoft.com/l...uling_priorities.asp nach.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 13.02.03 08:46 
Ich hab mir etwas zusammengesucht und wollte mal wissen was du davon hällst:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
var
  PriorityClass, Priority: Integer;
begin
  PriorityClass := GetPriorityClass(GetCurrentProcess);
  Priority := GetThreadPriority(GetCurrentThread);

  SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
  SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

  Sleep(1000); // Irgendwas machen ...

  SetThreadPriority(GetCurrentThread, Priority);
  SetPriorityClass(GetCurrentProcess, PriorityClass);
end;


Laut OH und meiner Logik hab ich alles was ich brauche. Wäre schön wenn einer das bestätigen könnte.
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Do 13.02.03 15:40 
Theoretisch müsste das so gehen. Dir sollte nur klar sein, dass auf diese Art der Thread eine höhere Priorität bekommt als der Kernel. Und das kann der Kernel dir übelnehmen...
Microsoft empfiehlt daher stattdessen, eine hohe Priorität zu verwenden (und zwar immer), und die Threads so lange schlafen zu lassen, bis sie benötigt werden. Wenn dein Programm mit Echtzeitpriorität sich nämlich in einer Endlosschleife verheddert, kann der Taskmanager, der nur mit hoher Priorität läuft, nicht aufgerufen werden. Schätze ich jedenfalls mal ;C)

Wie dem auch sei, du kannst es mit Sicherheit einfach mal probieren. Bedenke aber, dass der 9x-Scheduler nicht so ausgewachsen ist wie der von NT, und vielleicht bekommst du unter 9x eher Probleme.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 13.02.03 18:45 
Das ist mir schon klar, daß es da Probleme geben kann. Die hohen Werte hab ich vorerst nur zum testen. Was ich endgültig nehme, oder ob ich es in einem Bereich von dem User einstellen lasse, daß entscheide ich noch. Das Problem ist, daß ich ein Notfallprogramm geschrieben habe. Leider, als mal ein Notfall eintrat, war das Programm so in den Hintergrund geraten (Priorität), daß er seine Schutzwirkung nicht ausführen konnte.
Ist die Frage beantwortet? Das Problem gelöst?

Dann klicke hier, um das Thema entsprechend zu markieren!