2011-11-27 78 views
0

我有一名工人QThread其中創建了一個QObject派生對象。該對象是兩個其他QObject派生對象的集合,因此存在用於信號鏈接和將兩個內部對象綁定在一起的內部連接。QThread在QThread中丟失內部信號/插槽連接

工作人員QThreadQPlugin的成員,因此在插件的整個生命週期中都存在。

我遇到的問題是,儘管對象與應用程序的其餘部分交互良好,但這些內部連接似乎已被破壞。作爲一個實驗,我嘗試在主線程中創建對象,並且內部連接正在運行,所以這肯定是我在做錯誤QThread s。

我也嘗試將對象移回主線程(無可否認在內部連接完成後),但它沒有效果。我對內部連接的每種類型的連接(直接,排隊等)進行循環,但是它沒有任何作用或觸發死鎖錯誤。通過連接傳遞的所有類型都已註冊。

對象是兩個包含對象的父QObject,它們應該沒有區別,因爲它們全都駐留在同一個線程中,但我試圖將它們的父級設置爲NULL,以便排除它 - 它沒有影響勿庸置疑。 QThread而不是父母對任何東西。

我不能肯定的唯一的事情是,對象從駐留在主線程工廠單創建的,而是從工作線程稱爲 - 所以誰它屬於哪一種?我完全喪失了我在做什麼(或不做)打破這些連接,所以任何幫助都非常感謝。以下是應用程序相關部分的代碼:

此工作線程中的對象創建調用,對於上下文,該對象是來自OBJ導入器的多邊形網格。

// Create mesh. 
QString type = Sy::plugMeshType + "Sy_polyMesh"; 
QString name = proj->newNameIncrement("objMesh"); 

Sy::PluginArgs args; args << name; 
Sy_polyMesh* obj = Sy_pluginLoader::createInstance<Sy_polyMesh>(type, args); 
obj->mesh() = mesh; 
obj->resizeBB(); 
result_ = obj; 

// If in GUI mode, register it with the project. 
if (gui_) { 
    proj->registerSimObject(obj); 
    proj->selectObject(obj); 
} 

我有相當廣泛的插件架構,以我的應用程序,所以實際線程啓動代碼被抽象成一個抽象的工人類:

void Sy_abstractLongProcess::begin(Sy_abstractLongProcessWorker* worker) 
{ 
    worker_ = worker; 
    worker_->moveToThread(&thread_); 

    QObject::connect(&thread_, SIGNAL(started()), worker_, SLOT(work())); 

    QObject* thisObj = dynamic_cast< QObject* >(this); 

    QObject::connect(&thread_, SIGNAL(finished()), worker_, SIGNAL(finished())); 
    QObject::connect(worker_, SIGNAL(finished()), thisObj, SIGNAL(finished())); 
    QObject::connect(worker_, SIGNAL(progressChanged(double)), thisObj, SIGNAL(progressChanged(double))); 
    QObject::connect(worker_, SIGNAL(finished()), &thread_, SLOT(quit())); 

    thread_.start(); 
} 

由於所有相關的代碼是在許多蔓延我不會列出所有的東西(這個問題足夠長),但是如果你需要看別的東西,請不要猶豫,問 - 我需要所有的幫助。

+1

嘗試重現在_much_簡單的配置你的問題(兩個對象,兩個線程,一個信號/插槽)。這裏有太多的事情我們不知道。 (而且dynamic_cast並不能保證你的類層次結構的複雜性。) – Mat

+0

好的通話,我會試着把一些東西敲在一起。 dynamic_cast很好,但是這些連接沒有問題。 – cmannett85

回答

0

我幾乎在原崗位的答案,當我試圖移動對象回主線程,只是我做的太早了。一旦我完成了需要在工作線程中完成的修改,我必須將其移回 - 現在看起來很明顯!

感謝墊子把我的軌道上工作出來