Entwickler-Ecke
Windows API - Wie kann ich die Priorität meines Programms erhöhen.
Anonymous - Mi 12.02.03 22:22
Titel: Wie kann ich die Priorität meines Programms erhöhen.
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.
Delete - Mi 12.02.03 22:33
SetPriorityClass.
Anonymous - Do 13.02.03 00:07
Funktioniert das so wie ich es glaube, z.B.:
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
Tino: Code-Tags hinzugefügt.
Delete - 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:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/scheduling_priorities.asp nach.
Anonymous - Do 13.02.03 08:46
Ich hab mir etwas zusammengesucht und wollte mal wissen was du davon hällst:
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 - 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.
Anonymous - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!