Gast
2006-08-16, 11:47:22
In der Win32 API / MFC gab es ja diese Thread-Handles vom Typ HTHREAD, die sich als Wait Objects verwenden ließen, da sie beim Threadstart auf non-signaled gingen und beim Beenden des Threads auf signaled wechselten. Dadurch konnte man sehr komfortabel auf das Beenden eines Threads warten:
// Win32:
// Thread starten
HTHREAD hThread = _beginthread(threadfunc, 0, NULL);
// auf Beendigung warten
WaitForSingleObject(hThread);
// MFC:
// Thread starten
CWinThread *pThread = AfxBeginThread(threadfunc, NULL);
// auf Beendigung warten
WaitForSingleObject(pThread->hThread);
In .NET ist das etwas umständlicher, dort bringt die Thread-Klasse (System::Threading::Thread) das nötige Handwerkszeug offenbar nicht selbst mit:
// Thread Handle Ersatz
EventWaitHandle^ threadhandle = nullptr;
// Thread starten:
ThreadStart^ threadstart = gcnew ThreadStart(threadfunc);
Thread^thread = gcnew Thread(threadstart);
// auf Beendigung warten
if (threadhandle != nullptr)
threadhandle->WaitOne();
// in threadfunc
void threadfunc()
{
// Handle auf non-signaled setzen
threadhandle = gcnew EventWaitHandle(false, EventResetMode::ManualReset);
// ...
// Handle auf signaled setzen
threadhandle->Set();
}
Oder geht das auch einfacher?
// Win32:
// Thread starten
HTHREAD hThread = _beginthread(threadfunc, 0, NULL);
// auf Beendigung warten
WaitForSingleObject(hThread);
// MFC:
// Thread starten
CWinThread *pThread = AfxBeginThread(threadfunc, NULL);
// auf Beendigung warten
WaitForSingleObject(pThread->hThread);
In .NET ist das etwas umständlicher, dort bringt die Thread-Klasse (System::Threading::Thread) das nötige Handwerkszeug offenbar nicht selbst mit:
// Thread Handle Ersatz
EventWaitHandle^ threadhandle = nullptr;
// Thread starten:
ThreadStart^ threadstart = gcnew ThreadStart(threadfunc);
Thread^thread = gcnew Thread(threadstart);
// auf Beendigung warten
if (threadhandle != nullptr)
threadhandle->WaitOne();
// in threadfunc
void threadfunc()
{
// Handle auf non-signaled setzen
threadhandle = gcnew EventWaitHandle(false, EventResetMode::ManualReset);
// ...
// Handle auf signaled setzen
threadhandle->Set();
}
Oder geht das auch einfacher?