PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++.NET]auf Beenden eines Threads warten?


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?

Demirug
2006-08-16, 11:55:59
Dafür gibt es die Join Methode.

Kabelsalat
2006-08-16, 12:02:21
Eine mögliche Lösung wäre auch das asynchrone Aufrufen des Befehls mit Hilfe der ThreadPool-Klasse oder einfacher mit einem Delegaten (macht effektiv das Selbe). Hier gibt es alle notwendigen Infos: http://msdn2.microsoft.com/de-de/library/ms228975.aspx

Gast
2006-08-16, 12:56:26
Dafür gibt es die Join Methode.jo danke, das scheint genau das zu sein was ich gesucht habe.
Gleich noch eine Frage: was ist wenn ich auf mehrere Threads warte? In Win32/MFC ging das mit WaitForMultipleObjects(), das als Parameter ein Array mit den Handles allers Thread erhielt. Muß ich bei .NET dann von jedem Thread die Join-Methode aufrufen, etwa so:

// Ende aller Threads abwarten
thread1->Join();
thread2->Join();
thread3->Join();
//...
?

Gast
2006-08-16, 16:56:02
WaitHandle.WaitAll(WaitHandle[])

Gast
2006-08-16, 20:19:15
WaitHandle.WaitAll(WaitHandle[])das ist schon klar, nur muß man da wieder wie im Eingangsposting einen extra EventWaitHandle für jeden Thread einbauen. Mir ging es ja darum, ob man darauf verzichten kann.

Kabelsalat
2006-08-16, 20:28:07
Bastel dir eben eine Helferfunktion nach folgendem Schema:

void JoinAll(Thread[] threads)
{
foreach(Thread CurrentThread in threads)
{
CurrentThread.Join();
}
}

Gast
2006-08-17, 12:01:31
Hilft dir vielleicht die ManualResetEvent Klasse weiter?