CreateThread() erzeug invalid Handle
-
Hi,
ich habe folgenden eigentlich gehirnerweichend simplen Code:
tHandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)start_routine,arg,0,&id); SetPriorityClass(tHandle,HIGH_PRIORITY_CLASS); long l=GetLastError();
tHandle kommt mit einem Wert von z.B. 0x00000200 zurück - scheint mir ein bissl klein zu sein für einen void-Pointer, ist aber so.
Der anschließende Aufruf von SetPriorityClass() schlägt dann fehl, Last Error ist 6 - invalid Handle.
Was geht denn da schief? Offensichtlich liefert CreateThread Müll zurück - aber warum?
-
Was du zurückbekommst ist ein Thread-Handle. Und Handles sind keine Zeiger ... der Wert von 0x200 ist vollkommen OK.
Und SetPriorityClass() erwartet ein Process-Handle.
Die Funktion die du suchst heisst SetThreadPriority.
-
hustbaer schrieb:
Die Funktion die du suchst heisst SetThreadPriority.
Nein nicht wirklich - für bestimmte Prioritätswerte muss ich ja erst die PriorityClass setzen. Wie komme ich an ein dafür passendes Handle ran?
-
(HANDLE)-1, aber besser GetCurrentProcess aufrufen.
-
Doggg schrieb:
hustbaer schrieb:
Die Funktion die du suchst heisst SetThreadPriority.
Nein nicht wirklich - für bestimmte Prioritätswerte muss ich ja erst die PriorityClass setzen. Wie komme ich an ein dafür passendes Handle ran?
Wie -1 schon geschrieben hat: GetCurrentProcess().
Liefert ein pseudo-Handle welches immer als "aktueller Prozess" interpretiert wird.Und nur damit hier keine Verwirrung entsteht: SetPriorityClass() setzt immer die "Prioritäts-Klasse" des ganzen Prozesses, wodurch sich die effektiven Prioritäten aller Threads des Prozesses ändern. Wenn du einen Thread in deinem Prozess speziell bevorzugen möchtest, dann brauchst du zusätzlich SetThreadPriority.
Eine Liste welche Priority-Class/Thread-Priority Kombinationen zu welcher sog. "Base-Priority" führen gibt es hier:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms685100(v=vs.85).aspx