故事:
我在我的應用程序中對每個「長」操作使用QtConcurrent API。 它工作得很好,但是我在創建QObject時遇到了一些問題。任何方式來檢測QObject是否屬於「死」QThread?
考慮這一段代碼,它使用一個線程來創建一個「富」的對象:
QFuture<Foo*> = QtConcurrent::run([=]()
{
Data* data = /*long operation to acquire the data*/
Foo* result = new Foo(data);
return result;
});
它運作良好,但如果「富」類從QObject的類派生的「結果」實例屬於創建該對象的QThread。
所以要使用正確的信號與「結果」實例/插槽,一個人應該做這樣的事情:現在
QFuture<Foo*> = QtConcurrent::run([=]()
{
Data* data = /*long operation to acquire the data*/
Foo* result = new Foo(data);
// Move "result" to the main application thread
result->moveToThread(qApp->thread());
return result;
});
,所有作品exepected,我認爲這是正常的行爲和標稱解。
問題:
我有很多這樣的代碼,有時創建對象,也可以創建一個對象。它們中的大多數都是使用「moveToThread」調用正確創建的。
但有時候,我想念一個「moveToThread」調用。
然後,很多事情看起來像他們不工作(因爲這個對象插槽是「破」),沒有任何Qt警告。
現在,我有時會花很多時間來判斷爲什麼someting不起作用,因爲在理解它之前,只是因爲插槽沒有在特定的對象實例上被調用。
問題:
有什麼辦法幫我,以防止/檢測/調試這種情況? 例如:
- 每次刪除QThread時都會記錄一條警告,但有屬於它的對象還活着嗎?
- 每次信號發射到QThread被刪除的對象時都會記錄警告?
- 每當信號發送到對象(在另一個線程中)並且在超時之前未處理時,都會記錄警告嗎?
感謝
是否有一個原因是,'Foo'類型'的QObject必須具有非主線程關係(我認爲你的意思是「屬於」)? – eclarkso
第三個問題是重複的;請刪除它。你在問如何檢測掛起的事件循環 - 這與是否有信號被髮射無關。請參閱[這裏](http://stackoverflow.com/q/25038829/1329652)。 –