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
    Harald

    Jetzt habe ich eine Gegenfrage: Auf welches Objekt wendest du diese Methode an?

    AfxBeginThread(ThreadReceive, ...);
    waitForSingleObject(ThreadReceive, INFINITE); // geht nicht
    


  • aha,
    so mach ich's

    void 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 schriebt

    waitForSingleObject(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 schriebt

    waitForSingleObject(ThreadReceive, INFINITE); // geht nicht

    WIESO?!?!
    danke

    Es 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


Anmelden zum Antworten