Wie bemerke ich, wenn ein Thread zuende ist?



  • Hi Folks!

    Wie bekomme ich vom rufenden Programm aus heraus, dass ein Thread ordnungsgemäß beendet wurde bzw. zuende ist? Ich möchte im Hauptprogramm solange warten, bis der Thread abgelaufen ist.

    als Beispiel:

    CWaiterThread * waiter;
    
    // hier alles zum starten usw.
    
    waiter->activ = false;
    

    der Thread wertet in seiner Run() Schleife ständig "activ" aus und bricht ab, wenn es false ist.

    Nun fand ich heraus, dass im Taskmanager der Thread erst bis zu 15 Sekunden nach setzen der active Variable auf false beendet wurde und aus der Liste verschwand. Um da keinen Fehler reinzubekommen möchte ich mit dem Fortlauf des Programms warten, bis der Thread definitiv weg ist.

    Danke Ranger



  • Schau mal in der MSDN zum Thema WaitForSingleObject() nach.



  • CWinThread

    DWORD exitcodethread;	
    
    if (GetExitCodeThread(threadhandle, &exitcodethread) &&
    					exitcodethread == STILL_ACTIVE)
    				{
    // Noch aktiv
    
    				}
    else
    {
    // beendet
    }
    

    Das ganze mit WM_TIMER alle 50 ms



  • Unix-Tom macht seinem Namen alle Ehre.
    Man merkt gleich, dass er aus der Unix-Ecke kommt, wo es kein WaitForSingleObject gibt.
    Aber ich denke für das hier geschilderte Problem ist es die schnellste Lösung, ohne mit Timern arbeiten zu müssen.

    WaitForSingleObject (threadhandle,INFINITE);
    

    Über diese Zeile geht das Programm erst drüber, wenn der Thread wirklich beendet ist.



  • Man kann auch in dem betreffenden Thread am Ende der Thread-Prozedur ein Event-Object signalisieren, und dann in einem anderen Thread das Event abfragen oder darauf warten.

    Man kann auch das Thread-Handle testen mittels WaitForSingleObject( hThread, 0 ). Das Thread-Handle ist nur dann signalisiert, wenn der Thread beendet wurde.



  • Ich danke Euchg für die Hilfe.

    Ranger



  • zogi schrieb:

    Unix-Tom macht seinem Namen alle Ehre.
    Man merkt gleich, dass er aus der Unix-Ecke kommt, wo es kein WaitForSingleObject gibt.
    Aber ich denke für das hier geschilderte Problem ist es die schnellste Lösung, ohne mit Timern arbeiten zu müssen.

    WaitForSingleObject (threadhandle,INFINITE);
    

    Über diese Zeile geht das Programm erst drüber, wenn der Thread wirklich beendet ist.

    Und was glaubst du macht der Nutzer wenn sein Programm nicht reagiert.
    Dies ist dann nicht der Sinn eine Threads. Da kann ich gleich den Code in der DLG-Klasse aufrufen.

    Sicherlich gibt es aber X Lösungen.#
    Auch Nachrichten wären denkbar aber mein Code ist das einfachste.


Anmelden zum Antworten