Einen Thread richtig beenden
-
Hallo, ich habe hier einen Thread der mir Sorgen macht.
Ich starte also einen Thread der nicht machen soll als etwas berechnen. Deshalb hat er auch keine Messageloop.
Mein Problem ist. Das Ende des Thread wird nie erreicht.
DWORD MainThread(LPVOID pvoid) { // Diese MessageBox wird angezeigt MessageBox(0,"Start Thread 1","DEBUG",MB_OK); // Mache hier ein paar einfache Berechnungen. Macht er auch. // Und diese MessageBox wird nicht angezeigt. MessageBox(0,"Ende Thread 1","DEBUG",MB_OK); return 0; }
Ich beenden den Thread aus der Messagelopp vom Hauptpogramm aus mit der Funktion ExitThread(ExitCode). Den Exit Code hole ich mir nach dem Starten des Threads mit:
hThread=CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)MainThread, (LPVOID)hwndDlg,0,&dwThread); GetExitCodeThread(hThread,&ExitCode);
-
der Thrad wird erst beendet wenn die MessageBox "beantwortet" wird
MessageBox(0,"Ende Thread 1","DEBUG",MB_OK);
du solltest also auf das Ende des Thread warten bevor du GetExitCodeThread aufrufst
-
h² schrieb:
Ich beenden den Thread aus der Messagelopp vom Hauptpogramm aus mit der Funktion ExitThread(ExitCode).
das funzt so nicht. 'ExitThread' kann nur der thread selber aufrufen (ist in etwa das gleiche wie ein 'return' aus der threadfunktion). du solltest dem thread eine nachricht schicken (ein flag setzen etc.) damit der sich selbst beendet. ansonsten gibts noch 'TerminateThread' aber das ist in den seltensten fällen gut.
-
Und benutze nicht CreateThread direkt, sondern den Wrapper aus der Bibliothek.
-
ScriptGod schrieb:
der Thrad wird erst beendet wenn die MessageBox "beantwortet" wird
MessageBox(0,"Ende Thread 1","DEBUG",MB_OK);
du solltest also auf das Ende des Thread warten bevor du GetExitCodeThread aufrufst
Meinst du jetzt ExitThread() oder doch GetExítCodeThread() ???
Weil ich hole den Exit Code gleich nach dem erstellen mit CreateThread.
@Luckie welche Lib meinst du jetzt???
-
Keine Ahnung, was du für eine Library benutzt. Bei MS heiß der Wrapper BeginThread zum Beispiel.
-
h² schrieb:
ScriptGod schrieb:
der Thrad wird erst beendet wenn die MessageBox "beantwortet" wird
MessageBox(0,"Ende Thread 1","DEBUG",MB_OK);
du solltest also auf das Ende des Thread warten bevor du GetExitCodeThread aufrufst
Meinst du jetzt ExitThread() oder doch GetExítCodeThread() ???
Weil ich hole den Exit Code gleich nach dem erstellen mit CreateThread.
@Luckie welche Lib meinst du jetzt???
GetExítCodeThread sollte dir STILL_ACTIVE als ExitCode geben, da der Thread ja noch läuft. Ein Thread hat nur einen ExitCode nach dem beenden.
Wenn du warten willst, bis der Thread beendet ist kannst du das mit WaitForSingleObject z.B. machenWaitForSingleObject( hThread, INFINTE ); GetExitCodeThread ...
ExitThread kann nur der Thread selber aufrufen wenn er sich Beenden will, ist aber nicht unbedingt notig, ein einfaches return der Funktion reicht eigentlich aus.
Wenn du den Thread, den du gestartet hast, aus einem anderen heraus beenden willst musst du TerminateThread nehmen - ich würde aber davon abraten
-
ich würde es so realisieren
// exit thread if (m_hThread) { // wait for exit thread DWORD dwExCode; ThreadTerm(); GetExitCodeThread(m_hThread, &dwExCode); // wait while (dwExCode == STILL_ACTIVE && m_hThread) { ::WaitForSingleObject(m_hThread, 5); ::GetExitCodeThread(m_hThread, &dwExCode); } if (m_hThread) Close(); } ThreadTerm() { m_bRun=0; } Close() { ATLASSERT(m_hThread); ::CloseHandle(m_hThread); m_hThread=0; } DWORD StdThreadProc(void* pThis) { while (m_bRun) { } if (m_hThread && m_bRun) Close(); return 0; }
-
Normal laeuft nen thead in ner Schleife. Innerhalb der schliefe kommuniziert er auch meist mit dem Thread, der ihn erzeugt hat ... und zwar ueber events ....
Schau dir mal CreateEvent, SetEvent, ResetEvent, CloseEvent an ....
Und dazu dann WaitforSingleObject / WaitForMultiObject ...
Mit solchen zeugs stuert man seinen Thread, und laesst ihn auch runnerfahren ....
Ciao ...