thread/while schleife hängt
-
hallo,
problem,
ich hab ein programm mit das startet einen thread,
dieser thread wird solange ausgeführt, (while schleife) bis ich eine variable wieder auf 0 setzte. dann wird die while schleife nicht mehr durchlaufen,-> thread beendet.zur überprüfung habe ich ein waitForSingleObject eingebaut und festgestellt dass der thread von hin und wieder hängt, also nicht beendet wird.
woran kann das bitte liegen
danke
Harald
-
youCanCallMeAl schrieb:
hallo,
problem,
ich hab ein programm mit das startet einen thread,
dieser thread wird solange ausgeführt, (while schleife) bis ich eine variable wieder auf 0 setzte. dann wird die while schleife nicht mehr durchlaufen,-> thread beendet.zur überprüfung habe ich ein waitForSingleObject eingebaut und festgestellt dass der thread von hin und wieder hängt, also nicht beendet wird.
woran kann das bitte liegen
danke
HaraldJetzt habe ich eine Gegenfrage: Auf welches Objekt wendest du diese Methode an?
AfxBeginThread(ThreadReceive, ...); waitForSingleObject(ThreadReceive, INFINITE); // geht nicht
-
aha,
so mach ich'svoid CThread1Dlg::OnStart() { m_beep =1; m_ThreadBeep = AfxBeginThread (thrFunc_1, this); } UINT CThread1Dlg::thrFunc_1(LPVOID pParam) { CThread1Dlg* pDlg = (CThread1Dlg*) pParam; pDlg->Beep(); //memberfunktion als thread aufrufen return 0; } void CThread1Dlg::Beep() //member funktion { while(m_beep == 1) { Sleep(1000); MessageBeep(0); } } //und hier wirds gestoppt void CThread1Dlg::OnOK() { if(WAIT_TIMEOUT == WaitForSingleObject(*m_ThreadBeep, 5000)) { if(MessageBox("Thread wird gekillt!","Error", MB_YESNO+MB_ICONEXCLAMATION)==IDYES) { TerminateThread(*m_ThreadBeep,0); } } }
wieso funktioniert das nicht?
danke noch mal!
-
Hallo!
also meiner Meinung nach liegt der Fehler hier:if(WAIT_TIMEOUT == WaitForSingleObject(*m_ThreadBeep, 5000))
Soweit ich mich erinnern kann, bleibt der Thread hier sowieso hängen, also brauchst du nicht auf WAIT_TIMEOUT abfragen.
Probier mal etwas der folgenden Art:
Pseudocode:t=BeginThread(); WaitForSingleObject(t, INFINITE); MessageBox("Jetzt bin ich fertig!",MB_OK);
HTH,
Joe
-
t=BeginThread(); WaitForSingleObject(t, INFINITE); MessageBox("Jetzt bin ich fertig!",MB_OK);
ne, funktioniert nicht, da bleibt der rechner eben infinite (unendlich) hängen.
was ist der fehler? denkfehler?
-
Kommst du überhaupt regelmäßig aus der Beep raus?
Schreib mal nach
MessageBeep(0);sowas rein:
m_beep = (i<10);und vor das while:
int i=0;Wo setzt du eigentlich m_beep? wird das immer gesetzt?
Joe
-
ja, klar komm ich raus,
hab aber ne zeile hier im forum vergessen,
quellcode sieht tatsächlich bei mir so aus,//und hier wirds gestoppt void CThread1Dlg::OnOK() { m_beep = 0; //thread soll gestopt werden if(WAIT_TIMEOUT == WaitForSingleObject(*m_ThreadBeep, 5000)) { if(MessageBox("Thread wird gekillt!","Error", MB_YESNO+MB_ICONEXCLAMATION)==IDYES) { TerminateThread(*m_ThreadBeep,0); } } }
was passiert.... hin und wieder wird der thread so wie er soll gestoppt, machnmal hängt das ganze für 5s, und wird dann von TerminateThread abgeschossen.
an sich funkitoniert das ja auch so...ich wollte nur nicht dumm sterben, und deswegen gerne wissen:
1. wieso wird der thread manchmal gestoppt, manchmal aber nicht (durch m_beep)
2. sky21 schriebtwaitForSingleObject(ThreadReceive, INFINITE); // geht nicht
WIESO?!?!
danke
-
youCanCallMeAl schrieb:
ja, klar komm ich raus,
1. wieso wird der thread manchmal gestoppt, manchmal aber nicht (durch m_beep)
2. sky21 schriebtwaitForSingleObject(ThreadReceive, INFINITE); // geht nicht
WIESO?!?!
dankeEs war falsch geschrieben, daher ging nicht. Die Methode beginnt mit einem 'W', nicht 'w'.
-
danke, habs mit einem W,
hab mich hier wohl vertippt.die methode ansich funktioniert ja auch, es wird 5000sekunden gewartet, dann weiter gemacht. (TerminateThread)
also ist vielmehr die frage wieso hängt die while schleife?
nochmals vielen vielen dank
Harald