GetExitCodeThread(*,*)
-
Hallo zusammen
Ich habe hier ein Problem mit meinem Thread. Starten und laufen und so tut er wunderbar, nur wenn z.B. ein Button gedrückt wird, soll der Thread sich beenden und das Dialogfenster schließen.
Hab ich folgendermaßen implementiert:
//Header
void Starten(); static UINT AuswertungStarten (LPVOID pParam);//CPP
//Starten() //hier kommt ne ganze Reihe von Code und in der Schleife ist folgende bedingung: if ( abbruch ) //wird mit true gefüllt wenn button gedrückt wird { AfxEndThread(1,TRUE); }//AuswertungStarten() UINT CClassDlg::AuswertungStarten(LPVOID pParam) { CClassDlg* pDlg = (CClassDlgg*) pParam; pDlg->Starten(); return 0; }//Cancel Button this->abbruch = TRUE; DWORD ExitCode; GetExitCodeThread(AuswertungStarten,&ExitCode); if ( ExitCode == 1 ) OnCancel();Starten tue ich den Thread wie folgt:
AfxBeginThread(AuswertungStarten,this);Komischerweise steht direkt vor dem starten des Threads, nach starten des Threads und nach beedigung des Threads immer der gleiche Wert in ExitCode.
Ich hab keine Ahnung woran das liegt.
-
Naja, wenn du denn exitcode holst ist dein thread ja noch nicht beendet, auf 'abbruch' wird doch erst später reagiert.
-
ja gut ok
aber dann müsste er zugehen, wenn ich das zweite mal druf klicke
das tut er ja auch net
-
CWinThread* m_pThread = AfxBeginThread(...);1. Speichere irgendwo den gewonnen Zeiger von AfxBeginThread, wohl am besten in eine Membervariable.
//Cancel Button this->abbruch = TRUE; while(WaitForSingleObject(m_pThread->m_hThread, INFINITE) != WAIT_OBJECT_0); DWORD ExitCode; GetExitCodeThread(m_pThread->m_hThread,&ExitCode); if(ExitCode == 1) OnCancel();2. Warte mit WaitForSingleObject und dem Handle des Threads darauf, bis der Thread auch beendet wurde.
3. Wie machst du das eigentlich mit dem abbruch? Im Cancel Button Code hast du ein this->abbruch aber im Thread nur ein abbruch. Ich hoffe du weisst, was du da tust *g*
Grüssli
-
ja, abbruch is ne member
hab nur das this vergessen *zwinka*
aber das hört sich gut an
ich proebiere das gleich aus
danke schonmal
-
...dann must du aber auch innerhalb deiner Threadfunktion auf abbruch reagieren und nicht im dialog.
Edit: .. machst Du schon
...war gestern bei Robbie 
-
Gerade noch einen Fehler entdeckt. Mich hat das GetExitCodeThread schon vorhin gestört, dass du dem einen Zeiger auf deine Funktion übergibst, doch ich habe damit noch nie gearbeitet und deshalb nicht weiterüberlegt. Nun habe ich allerdings endlich in der MSDN nachgeschaut und siehe da ... GetExitCodeThread verlangt ein Handle auf deinen Thread und einen Zeiger auf eine DWORD Variable. Ich habe es oben editiert und führe es hier nochmals auf:
DWORD dwExitCode = 0; GetExitCodeThread(m_pThread->m_hThread, &dwExitCode);Grüssli
-
jepp, das tu ich ja auch
dann beende ich den thread
-
Dravere schrieb:
Gerade noch einen Fehler entdeckt. Mich hat das GetExitCodeThread schon vorhin gestört, dass du dem einen Zeiger auf deine Funktion übergibst, doch ich habe damit noch nie gearbeitet und deshalb nicht weiterüberlegt. Nun habe ich allerdings endlich in der MSDN nachgeschaut und siehe da ... GetExitCodeThread verlangt ein Handle auf deinen Thread und einen Zeiger auf eine DWORD Variable. Ich habe es oben editiert und führe es hier nochmals auf:
DWORD dwExitCode = 0; GetExitCodeThread(m_pThread->m_hThread, &dwExitCode);Grüssli
jo sicher; stand da ja auch; aber da ich den zeiger bis eben noch nicht zugewiesen hatte, habe ich halt die funktion übergeben

-
hey, es funktioniert *ggg*
dankeschön

-
Boch mal was grundsätzliches, wenn man CWinThread* m_pThread = AfxBeginThread(...); ausführt, dann zerstört sich das CWinThread Objekt sofort wenn der Thread terminiert. Wenn man also noch was kontrollieren will, oder gar auf den Thread warten will, dann muss man m_bAutoDelete auf FALSE setzen und das Objekt selber per delete entsorgen!
-
Ups ... da hat er sogar recht.
Ehm ... aber wenn man m_bAutoDelete verändert, sollte man dann den Thread nicht mit CREATE_SUSPENDED starten? Bzw. als Codeausschnitt:m_pThread = AfxBeginThread(AuswertungStarten, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); if(m_pThread != NULl) { m_pThread->m_bAutoDelete = FALSE; m_pThread->ResumeThread(); } else { // Thread konnte nicht gestartet werden. }Grüssli
-
alles klar
hab ich jetzt alles auch so gemacht
nur: wie lösche ich den thread? einfach mit Delete(); ?
Edit: Neee, er wirft mir zwar keinen Fehler aus, aber dafür Memory Leaks *wein*
-
Nicht Delete() sondern delete!