2012-09-11 109 views
0

我一直在我的iPhone應用程序中使用Boost線程,並且偶然發現了一個問題。每當應用程序試圖啓動這樣的線程時,每當嘗試調用start_thread()時都會引發錯誤,並且應用程序崩潰。嘗試啓動Boost線程時出錯

我真的不知道從哪裏開始調試 - 從調試器中看不出來爲什麼boost線程無法初始化。應該注意的是,這隻發生在應用程序運行一段時間後,並且在多個線程已經成功啓動之後。

我最近一直工作在UI,並且我一直在使用下面的命令,以確保每一個更新的用戶界面立即發生在被稱爲:

[myViewController performSelectorOnMainThread : @ selector(show_myButton) withObject:nil waitUntilDone:YES]; 

雖然該命令似乎工作,並立即更新UI(在它被延遲之前),我擔心它可能會對我遇到的提升線程問題負責。這聽起來可能嗎?有沒有人曾經遇到過這樣的事情,並對可能出現什麼問題有任何建議?

這裏,是爲了啓動線程的代碼:

void ObjectiveCPlusPlusInterface::startMyThread(void* a, myObject* b) 
{ 
boost::thread AVPlayerThread = boost::thread(&ObjectiveCPlusPlusInterface::myThreadFunction, this, a, b); 
} 

(其中一個& b是變量)

void ObjectiveCPlusPlusInterface::myThreadFunction(void* a, myObject* b) 
{ 
... 
} 

正如你所看到的,startMyThread()嘗試啓動升壓線程,它執行功能myThreadFunction()。但是,未達到myThreadFunction(),因爲啓動boost線程會引發錯誤。

+0

你可以請發表包含創建線程的代碼,直到加入它的點? (省略不相關的中間代碼) –

+0

另外,看看[這個問題](http://stackoverflow.com/q/2109483/596781),你確定你在捕捉異常嗎? –

+0

謝謝 - 我現在已經添加了代碼。關於捕捉例外情況,不,我不確定我是否正在這樣做 - 並且,在下面查看您的答案時,我不完全明白如何執行此操作。你能就此給我任何建議嗎? – user1295558

回答

0

看着at the manual,我們看到構造函數boost::thread可以拋出一個異常。請確保您檢查:

try 
{ 
    boost::thread AVPlayerThread(&ObjectiveCPlusPlusInterface::myThread, this, a, b); 

    AVPlayerThread.detach(); // or join()? 
} 
catch (boost::thread_resource_error const &) 
{ 
    // resource error (print a diagnostic!) 
} 
catch (...) 
{ 
    // some other exception (print a diagnostic!) 
} 

更新:你的編輯後,我看你不加入或分離線程!這是不允許的。

你可以把整個塊放在你的startMyThread函數中。

+0

感謝您的支持。你能告訴我如何在我的代碼中實現這個嗎?我以前沒有用過這樣的東西。另外,我目前沒有'join()'或'detach()'調用。我認爲'join()'是否意味着主線程會等待boost線程返回?如果是這樣,那不會爲我的目的。 'detach()',那麼,我應該用什麼? – user1295558

+0

@ user1295558:正確,'join()'將阻塞,直到線程函數返回。 'detach()'將使線程無限期地運行。我已經更新了這篇文章,以便您能夠將其直接粘貼到您的功能中。 –

+0

謝謝。我已經在線程初始化後將它分離出來,並且放入你推薦的catch。由於我做了這個改變,錯誤沒有發生,但是,因爲它只是偶爾發生,所以很難判斷問題是否得到解決。我會繼續測試,看看它是否會重現。您是否認爲,在建議我拆線時,這可能是我的問題的解決方案? – user1295558

相關問題