Ich muss einen Thread spawnen, wenn ein bestimmtes Triggerereignis innerhalb einer Klasse Foo empfangen wird. Das Triggerereignis wird von einer Winsock-Serverklasse empfangen, die einen Verweis auf die Variable triggerEvent
enthält.Threading in objektorientierte, ereignisgesteuerte Anwendung
bool Foo::HandleEvents()
{
while (1)
{
// Other things are done at the top of this loop
switch (triggerEvent)
{
case 'h':
{
// I instantiate an object here to do
// what I need to do in the thread.
// I use a pointer that is a private
// member of Foo.
thingMaker = new ThingMaker(params);
// Spawn a new thread here calling a
// function of ThingMaker and using thingMaker
break;
}
case ...: return true;
default: break;
}
}
}
Da der Faden zu seinem Fall in den switch
lokal ist, verliere ich Zugang zu ihm auf break
. Ich kann join()
nicht anrufen, weil ich mich mit der Echtzeitverarbeitung befasse und ich kann nicht auf den Thread warten, bis ich weiß, dass es fertig ist.
Ich fragte vor kurzem eine Frage über Threading here in Bezug auf die gleiche Anwendung und wurde gesagt, detach()
ist eine schlechte Praxis; Ich denke auch, dass meine Frage zu vage war, da die angebotene Lösung nicht meinen Bedürfnissen entsprach und meine Anwendung sich seitdem in der Architektur geändert hat.
Ich habe auch versucht, den Thread in short-life-Manager-Klasse zu kapseln, die Instanzen von ThingMaker erstellt, aber ohne Erfolg.
Wie gehe ich vor? Ich vermute, mein Hauptproblem ist der Umfang, aber meine Möglichkeiten sind begrenzt. Foo::HandleEvents()
kann nicht verzögert werden oder sonst verliere ich kritische Daten.
Haben Sie ein System in Betracht gezogen, in dem Sie die Thread-Lebensdauern * kontrollieren *, z. B. einen Threadpool, in dem der gepostete Code Ihre 'params' in eine vom Pool überwachte Warteschlange sendet, damit die Arbeit ausgelöst wird? – WhozCraig
Wie wäre es mit "Futures" zu tun? Hast du C++ 11? – Arunmu
Warum nicht den 'thread' zu einem Mitglied der' Foo'-Klasse machen, dann hast du immer Zugriff darauf? Eine Frage, die ich habe, ist was willst du passieren, wenn der Thread noch ausgeführt wird, wenn 'HandleEvent' Funktion ausgelöst wird? Sie benötigen möglicherweise Daten Mitglied, um alle ausstehenden Threads zu verfolgen ... –