kleine rätselfrage: warum funktioniert dieser code nicht?
-
Liest eigentlich niemand von Euch die Doku zu "GetExitCodeThread"??? Da steht es doch ganz unten... *kopfschüttel*
-
Jochen Kalmbach schrieb:
Die Lösung steht doch in der Docu ganz unten...
meinst du das warning in den remarks von GetExitCodeThread()?
das ist es nicht. mein thread setzt den exitcode auf 0, nicht STILL_ACTIVE
-
net schrieb:
Jochen Kalmbach schrieb:
Die Lösung steht doch in der Docu ganz unten...
meinst du das warning in den remarks von GetExitCodeThread()?
das ist es nicht. mein thread setzt den exitcode auf 0, nicht STILL_ACTIVEDann hast DU uns nicht den korrekten Code gezeigt... eine Endlosschliefe entsteht nur mit:
#include <windows.h> #include <stdio.h> #include <tchar.h> DWORD WINAPI t(LPVOID) { return STILL_ACTIVE; } int _tmain() { DWORD tid; HANDLE hT = CreateThread(NULL, 0, t, 0, 0, &tid); DWORD exitcode = STILL_ACTIVE; while (exitcode == STILL_ACTIVE) GetExitCodeThread (hT, &exitcode); }
Wird was anderes zurückgegen, so beendet sich das Programm tadellos.
-
Jochen Kalmbach schrieb:
Wird was anderes zurückgegen, so beendet sich das Programm tadellos.
nicht immer. das ist ja das schlimme. wollt ihr noch rätseln oder soll ich sagen woran's lag?
-
es könnte auch TerminateThread(threadhandle,STILL_ACTIVE) sein
-
Sag es uns du Ratefuchs!
Mfg Ominion
-
Es ist natürlich auch miserabel den Rückgabewert nicht zu prüfen... wenn das Handle nicht genügend Rechte hat, gibt es auch Probleme...
-
Hallifax schrieb:
es könnte auch TerminateThread(threadhandle,STILL_ACTIVE) sein
nein, es werden keine faulen tricks verwendet. die threadfunction sieht ungefähr so aus
DWORD thread (DWORD param) { for (;;) { if (stop_the_thread == TRUE) return 0; // hier etwas anderer code // ohne return, ExitThread() und dergleichen } }
-
Jochen Kalmbach schrieb:
Es ist natürlich auch miserabel den Rückgabewert nicht zu prüfen... wenn das Handle nicht genügend Rechte hat, gibt es auch Probleme...
leider auch nicht. das handle wird vom gleichen prozess erzeugt. rückgabewert direkt von CreateThread()... und der thread wird auch gestartet d.h. handle ist gültig, nicht INVALID_HANDLE_VALUE oder sowas
-
Dann hast Du zumindest Deine Threadproc falsch angegeben (hier fehlt ein WINAPI; ganz abgesehen davon, dass der übergabeparameter auch falsch deklariert ist (müsste LPVOID sein)).
-
Jochen Kalmbach schrieb:
Dann hast Du zumindest Deine Threadproc falsch angegeben (hier fehlt ein WINAPI).
sorry, das hatte ich vergessen. im original steht da noch ein __stdcall. doch auch wenn ich es wegnehme ändert das nichts an dieser misteriösen endlosschleife
-
Es heißt mysteriös.
. Aber los du Ratefuchs, sag uns die Lösung!
Mfg Ominion
-
In meiner Doku steht noch was:
Note This API is part of the complete Windows CE OS package as provided by Microsoft. The functionality of a particular platform is determined by the original equipment manufacturer (OEM) and some devices may not support this API.
-
Hallifax schrieb:
In meiner Doku steht noch was:
Ich glaube, du hast da die falsche Doku. net hat jedenfalls nichts davon gesagt, dass der CE benutzt.
-
naja, vielleicht ist das ja das Problem...
-
Ominion schrieb:
Es heißt mysteriös.
. Aber los du Ratefuchs, sag uns die Lösung!
okay, so gehts:
stop_the_thread = TRUE; volatile DWORD exitcode = STILL_ACTIVE; while (exitcode == STILL_ACTIVE) GetExitCodeThread (threadhandle, (DWORD*)&exitcode);
seltsam? nicht wahr?
-
Das muss ich aber nicht verstehen oder?
Mfg Ominion
-
toll wenn der compiler andere einstellungen hat und anders optimiert kann das aber auch ned auftreten müssen, die frage war von anfang an dumm
-
Danke Oma. Dank dir habe ich jetzt den Durchblick was Sache ist.
Mfg Ominion
-
wenn du einmal ein buch lesen würdest wüsstest du das volatile sicherstellt daß variablen werte immer aus dem speicher in die register geladen werden was sonst wegen optimierungen nicht immer gemacht werden muss