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. machen

    WaitForSingleObject( 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 ...


Anmelden zum Antworten