我有一名工人QThread
其中創建了一個QObject
派生對象。該對象是兩個其他QObject
派生對象的集合,因此存在用於信號鏈接和將兩個內部對象綁定在一起的內部連接。QThread在QThread中丟失內部信號/插槽連接
工作人員QThread
是QPlugin
的成員,因此在插件的整個生命週期中都存在。
我遇到的問題是,儘管對象與應用程序的其餘部分交互良好,但這些內部連接似乎已被破壞。作爲一個實驗,我嘗試在主線程中創建對象,並且內部連接正在運行,所以這肯定是我在做錯誤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();
}
由於所有相關的代碼是在許多蔓延我不會列出所有的東西(這個問題足夠長),但是如果你需要看別的東西,請不要猶豫,問 - 我需要所有的幫助。
嘗試重現在_much_簡單的配置你的問題(兩個對象,兩個線程,一個信號/插槽)。這裏有太多的事情我們不知道。 (而且dynamic_cast並不能保證你的類層次結構的複雜性。) – Mat
好的通話,我會試着把一些東西敲在一起。 dynamic_cast很好,但是這些連接沒有問題。 – cmannett85