/ / Stoppen eines Threads in Win32 / MFC - c ++, Multithreading, Winapi, mfc

Einen Thread in Win32 / MFC stoppen - C ++, Multithreading, Winapi, MFC

Ich habe einige Threading-bezogene Codes durchgelesen und diesen Code gefunden:

MyThread::start()
{
//Create a thread
m_pThread = AfxBeginThread(/*some parameters*/)

//Create a duplicate handle for the created thread
m_hDuplicateHandle = DuplicateHandle(/* some more parameters*/)
}

MyThread::stop()
{
//Set some variables so that the thread comes out of its run() function
WaitForSingleObject(m_hDuplicateHandle, defaultTimeout);

CloseHandle(m_hDuplicateHandle);
}

Meine Frage, warum ist das doppelte Handle erforderlich? Können wir nicht direkt auf den ursprünglichen Thread-Griff warten? Wird er irgendwie ungültig?

Antworten:

8 für die Antwort № 1

AfxBeginThread gibt a zurück CWinThread* und MFC nimmt an, dass es das Handle verwaltet, das dem Thread zugeordnet ist.

Um das Handle sicher direkt verwenden zu können, müssen Sie es also duplizieren. Andernfalls kann es vorkommen, dass MFC das Handle geschlossen hat, bevor der Thread beendet ist, bevor Sie zum WaitForSingleObject-Aufruf gelangen.

Wenn Sie direkt mit der win32-CreateThread-API arbeiten, können Sie sicherlich direkt auf das zurückgegebene Handle warten.


2 für die Antwort № 2

Das Mitglied m_hThread von CWinThread ist nur geschlossenbei der Zerstörung des CWinThread-Objekts. Das Objekt wird sich selbst löschen, wenn m_bAutoDelete auf TRUE gesetzt ist. Der Thread wird sich selbst löschen, nachdem die Worker-Funktion oder die Nachrichtenschleife des Benutzers beendet wurde. Weitere Informationen finden Sie unter _AfxThreadEntry. Der Grund für die Duplikation des Handles besteht darin, die Verwendung eines ungültigen Handles oder den Zugriff auf ein ungültiges CWinThread * zu vermeiden, wenn der Thread beendet und vor stop () zerstört wird. wird genannt.