我需要在類Foo中收到某個觸發器事件時產生一個線程。觸發器事件由Winsock服務器類接收,該類服務器引用了變量triggerEvent
。線程在面向對象的事件驅動的應用程序中
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;
}
}
}
由於線程局部其在switch
情況下,我無法訪問它break
。我不能撥打join()
,因爲我正在處理實時處理,不能等待線程完成,除非我知道它已經完成。
我最近問了一個關於線程here關於同樣的應用程序的問題,並被告知detach()
是不好的做法;我也認爲我的問題太模糊了,因爲提供的解決方案最終不符合我的需求,而且我的應用程序因此在架構上發生了變化。
我也試圖封裝線程在短生命管理器類中創建ThingMaker的實例,但無濟於事。
我該如何解決這個問題?我懷疑我的主要問題是範圍,但我的選擇是有限的。 Foo::HandleEvents()
不能被延遲,否則我會丟失關鍵數據。
您是否考慮過一個系統,您可以控制線程生命週期,例如線程池,在該線程池中發佈的代碼將您的'params'發佈到池監控的隊列中,以便分派工作? – WhozCraig
如何處理'期貨'?你有C++ 11嗎? – Arunmu
爲什麼不讓'thread'成爲'Foo'類的成員,那麼你總是可以訪問它?我有一個問題,如果在觸發'HandleEvent'函數時線程仍在執行,您希望發生什麼?您可能需要數據成員來跟蹤所有未完成的線程... –