Autor |
Beitrag |
Finch
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 31.01.09 16:50
Hallo, ich möchte gerne von einem anderen Programm, zum Beispiel des Explorers die Priorität festlegen.
Ich hab es mit folgenden Zeilen versucht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function getPid(const name: string): integer; var hProcSnap: THandle; pe32: TProcessEntry32; begin result:= 0; hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hProcSnap = INVALID_HANDLE_VALUE then exit;
pe32.dwSize := SizeOf(ProcessEntry32);
if Process32First(hProcSnap, pe32) = true then
while Process32Next(hProcSnap, pe32) = true do begin if lowerCase( pe32.szExeFile) = name then begin result:= pe32.th32ProcessID; break; end; end; CloseHandle(hProcSnap); end; |
Delphi-Quelltext 1:
| setpriorityclass(getPid('explorer.exe'), HIGH_PRIORITY_CLASS); |
Nur leider passiert nicht viel. Die Prozess ID bekomme ich ja korrekt. Könnt ihr mir sagen, was mein Fehler ist ?
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 31.01.09 17:09
Du hast die Doku nicht richtig gelesen. Eine Prozess-ID ist kein Handle.
Du musst dir dieses also erst holen. Das geht mit OpenProcess: Delphi-Quelltext 1:
| YourHandle := OpenProcess(PROCESS_SET_INFORMATION, false, YourPID); | Und CloseHandle nicht vergessen. 
|
|
Finch 
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 31.01.09 17:33
Zuletzt bearbeitet von Finch am So 01.02.09 02:34, insgesamt 1-mal bearbeitet
|
|
Finch 
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 31.01.09 17:59
Ok vielen Dank für die schnelle und korrekte Antwort! Ich schreibe noch mal für alle anderen, komplettes Beispiel um von einem beliebigen Prozess die Priorität ändern kann:
Als 1. ist es wichtig, ' Tlhelp32 ' in die Uses einzubinden !
Als 2. erstellt man eine beliebige Prozedur ( ich teste immer gern durch einen Button, welchen ich hier einfach mal nehme ;9 )
procedure Button1Click(Sender: TObject);
Als 3. nehme man diese Funktion getPid !
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function getPid(const name: string): integer; var hProcSnap: THandle; pe32: TProcessEntry32; begin result:= 0; hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hProcSnap = INVALID_HANDLE_VALUE then exit;
pe32.dwSize := SizeOf(ProcessEntry32);
if Process32First(hProcSnap, pe32) = true then
while Process32Next(hProcSnap, pe32) = true do begin if lowerCase( pe32.szExeFile) = name then begin result:= pe32.th32ProcessID; break; end; end; CloseHandle(hProcSnap); end; |
Als letztes lassen wir nun durch einen Klick auf den Button mal die Prozesspriorität von dem Explorer auf Echtzeit setzen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Button1Click(Sender: TObject); var priosetzhandle : thandle; begin priosetzhandle := OpenProcess(PROCESS_SET_INFORMATION, false, getPid('explorer.exe')); setpriorityclass(priosetzhandle, REALTIME_PRIORITY_CLASS); CloseHandle(priosetzhandle); end; |
Mit NORMAL_PRIORITY_CLASS setz man den Prozess wieder auf normal 
Zuletzt bearbeitet von Finch am Sa 31.01.09 18:01, insgesamt 1-mal bearbeitet
|
|
Finch 
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 31.01.09 17:59
sry doppel Post...bitte löschen
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 31.01.09 18:04
Finch hat folgendes geschrieben : | Ich schreibe noch mal für alle anderen, komplettes Beispiel um von einem beliebigen Prozess die Priorität ändern kann: |
Das ist schön.
An der Stelle aber auch noch eine Warnung:
Wenn man bei dem falschen Prozess die Priorität auf Echtzeit setzt, dann geht gar nix mehr, weil nicht mal die Oberfläche noch Rechenzeit bekommt, dann bewegt sich nicht einmal mehr die Maus richtig.
Normalerweise reicht HIGH_PRIORITY_CLASS auch aus.
|
|
Finch 
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 31.01.09 18:19
jaenicke hat folgendes geschrieben : |
Normalerweise reicht HIGH_PRIORITY_CLASS auch aus. |
Das ist natürlich richtig, war ja auch nur mal nen Beispiel. Es gibt ja verschiedene Möglichkeiten:
RAD Studio 2009 Hilfe hat folgendes geschrieben: |
Priority Meaning
ABOVE_NORMAL_PRIORITY_CLASS
0x00008000 Process that has priority above NORMAL_PRIORITY_CLASS but below HIGH_PRIORITY_CLASS.
Windows NT and Windows Me/98/95: This value is not supported.
BELOW_NORMAL_PRIORITY_CLASS
0x00004000 Process that has priority above IDLE_PRIORITY_CLASS but below NORMAL_PRIORITY_CLASS.
Windows NT and Windows Me/98/95: This value is not supported.
HIGH_PRIORITY_CLASS
0x00000080 Process that performs time-critical tasks that must be executed immediately. The threads of the process preempt the threads of normal or idle priority class processes. An example is the Task List, which must respond quickly when called by the user, regardless of the load on the operating system. Use extreme care when using the high-priority class, because a high-priority class application can use nearly all available CPU time.
IDLE_PRIORITY_CLASS
0x00000040 Process whose threads run only when the system is idle. The threads of the process are preempted by the threads of any process running in a higher priority class. An example is a screen saver. The idle-priority class is inherited by child processes.
NORMAL_PRIORITY_CLASS
0x00000020 Process with no special scheduling needs.
PROCESS_MODE_BACKGROUND_BEGIN
0x00100000 Begin background processing mode. The system lowers the resource scheduling priorities of the process (and its threads) so that it can perform background work without significantly affecting activity in the foreground.
This value can be specified only if hProcess is a handle to the current process. The function fails if the process is already in background processing mode.
Windows Server 2003 and Windows XP/2000: This value is not supported.
PROCESS_MODE_BACKGROUND_END
0x00200000 End background processing mode. The system restores the resource scheduling priorities of the process (and its threads) as they were before the process entered background processing mode.
This value can be specified only if hProcess is a handle to the current process. The function fails if the process is not in background processing mode.
Windows Server 2003 and Windows XP/2000: This value is not supported.
REALTIME_PRIORITY_CLASS
0x00000100 Process that has the highest possible priority. The threads of the process preempt the threads of all other processes, including operating system processes performing important tasks. For example, a real-time process that executes for more than a very brief interval can cause disk caches not to flush or cause the mouse to be unresponsive.
|
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 31.01.09 23:46
Ich würde mir wünchen, wenn deine Funktion die alte Priorität zurückgibt, so dass man diese wieder herstellen kann. Desweiteren rate ich davon die Priorität von Prozessen und Threads zu ändern. Ich bin der Meinung, wenn man zum Beispiel die Priorität von Threads ändern muss, damit das Programm funktioniert, hat man was falsch gemacht. Und, ich meine, die Priortät von fremden Prozessen hat einen nicht zu interessieren. Der Scheduler von Windows verteilt die Zeitscheiben schon sehr gut. Ein manuelles Eingreifen macht selten etwas besser.
|
|
Finch 
Hält's aus hier
Beiträge: 7
|
Verfasst: So 01.02.09 02:34
Luckie hat folgendes geschrieben : | Ich würde mir wünchen, wenn deine Funktion die alte Priorität zurückgibt, so dass man diese wieder herstellen kann. Desweiteren rate ich davon die Priorität von Prozessen und Threads zu ändern. Ich bin der Meinung, wenn man zum Beispiel die Priorität von Threads ändern muss, damit das Programm funktioniert, hat man was falsch gemacht. Und, ich meine, die Priortät von fremden Prozessen hat einen nicht zu interessieren. Der Scheduler von Windows verteilt die Zeitscheiben schon sehr gut. Ein manuelles Eingreifen macht selten etwas besser. |
Das Programm bezieht sich bei meiner Verwendung natürlich nicht auf den Explorer. Diese Zeilen sind nur ein Bruchteil, und dienen nur als Nebenfunktion. Mein komplettes Programm läuft im Hintergrund und man kann durch Hotkeys bestimmte Anwendungen steuern. ( Minimieren, maximieren, top most u.s.w. ). Ich habe das extra für gestresste Schüler in meiner Berufsschule entwickelt. ^^ ....mansche Überprüfungs und "Most Top ...Screen" Programme, können dort schon nervig sein.
Wer weiteres über die Themen: " steuern, verstecken und verändern " andere Prozesse und Fenster wissen möchte, sowohl auch über einfache Hotkey Funktionen, darf mich gerne anschreiben.
|
|
|