Herausfinden wann ein Thread beendet (fertig) ist



  • Hi,

    ich hab hier ein echt kniffeliges Problem. Erstmal eine Kurze Einführung. Wenn mein Programm gestartet wird, dann wird ein Thread erzeugt der den Inhalt einer (größeren) Datei in einige Variablen Variablen speichert. So kann der Benutzer das Programm benutzen ohne das er irgendetwas davon merkt.

    Jetzt muss ich aber von einer anderen Stelle des Programms aus ebenfalls auf diese Datei zugreifen und sie Auslesen. Das Problem ist, wenn der Nutzer zu schnell zur anderen Stelle geht, dann versucht mein Programm die Datei zu öffnen obwohl sie (noch) von einem anderen Prozess verwendet wird.

    Jetzt würd ich gern wissen wie man herausfinden kann wann der "Auslesethread" fertig ist (und endlich die verd... Datei geschlossen hat). Ein Kollege hat mir da "WaitForSingleObject" empfohlen, aber ihr könnt euch sicherlich denken das das nicht Funktioniert (zumindest nich so wie es soll).

    Achja ich sollte vieleicht dazu sagen das der Thread in der Hauptdialogklasse erstellt wird und ich aber von einer anderen Dialogklasse heraus wissen muss ob der Thread schon beendet ist oder überhaupt existiert. Den Thread hab ich übrigens auch nicht geschrieben (war ein anderer Kollege von mir, der aber auch noch nicht soviel Ahnung davon hat).

    So wird der Thread in der Hauptdialogklasse erstellt:

    //Global definiert
    CWinThread *p_GlobalThread;
    //HauptDialogKlasse
    
    BOOL MainDLG::OnInitDialog()
    {
    //   [.....]
    
    	m_StopThread = CreateEvent(NULL, TRUE, FALSE, NULL); //m_StopThread und m_WaitThread sind public Membervariablen vom Typ HANDLE 
    	m_WaitThread = CreateEvent(NULL, TRUE, FALSE, NULL);
    
    	CWinThread *pThread; //CB geändert am 21.08.2005
    	pThread = p_GlobalThread = AfxBeginThread(ThreadFunc, this, THREAD_PRIORITY_NORMAL,0,0); //p_GlobalThread ist eine Globale Variable vom Typ CWinThread* (um von überall her auf den Thread-Handle zuzugreifen)
    
    return TRUE;  
    }
    
    UINT CBDMPDlg::ThreadFunc(LPVOID lParam)
    {
    	iDaten.b_DatenGeladen = false;	 //iDaten ist eine Speicherklasse die Daten liest, ändert, speichert.... 
    	iDaten..LadeDateienAusVerzeichnis(lParam);
    	iDaten..b_DatenGeladen = true;
    
    	return 0;
    }
    

    Ich glaub das ist das der wesentliche Programmcode... der Thread funktioniert ja einwandfrei, nur kann ich halt nicht herausfinden wann er fertig ist.

    Und hier ist mein WaitForSingleObject Aufruf aus einer anderen Klasse heraus:

    bool Lade::LadeDaten(CString Pfad)
    {
    CFile Datei;
    	//darum wird hier darauf gewartet bis der Thread fertig 
    		DWORD rueckgabewert;
    		rueckgabewert = WaitForSingleObject(p_GlobalThread, INFINITE);    //in p_GlobalThread steht (eigentlich) der Handle des Threads
    
    Datei.Open(pfad, CFile::modeRead); //hier kommts zu einem Fehler da die Datei noch geöffnet sein kann
    
    // [.....]
    
    }
    

    Naja im Debug Modus wartet er keine 0xFFFFFF Mikrosekunden... er rennt einfach über die WaitForSingleObject - Funktion drüber und schreibt in "rueckgabewert" irgendeine riesen große Zahl...

    Weis jemand von euch was ich mit dem WaitForSingleObject falsch gemacht habe? Das muss doch gehen... das kann doch nicht so schwer sein einfach zu warten bis ein Thread beendet ist. 😕 😕
    Ich will auch keine Globale Variable "b_ThreadFertig" machen und diese mit einer

    while(!b_ThreadFertig) 
    {;}
    

    abfragen (dann dauert das auslesen ja noch länger 😞 )



  • Es klappt doch mit WaitForSingleObject. Hab den (kleinen) Fehler gefunden:

    [cpp]

    //Global Definiert, richtig
    CWinThread *p_GlobalThread;

    //Aufruf, richtig
    p_GlobalThread = AfxBeginThread(ThreadFunc, this, THREAD_PRIORITY_NORMAL,0,0); //AfXBeginThread gibt CWinThread* zurück

    //Übergabe Falsch
    WaitForSingleObject(p_GlobalThread, INFINITE);

    //es müsste so ausssehen
    WaitForSingleObject(*p_GlobalThread, INFINITE);

    [/cpp] 🙂


Anmelden zum Antworten