我已經看到QThread的許多帖子和文章,並在QThreads之間移動QObjects,但唉,它仍然讓我頭疼。這是我想要採取的模式:我不知道爲什麼我的QThread模式阻塞
#include "connectionthread.h"
#include <cassert>
ConnectionThread::ConnectionThread(ConnectionPtr const &connectionPtr) :
worker(NULL),
m_connectionPtr(connectionPtr)
{
connect(this, SIGNAL(executeSignal()), this, SLOT(loginProcess()));
}
void
ConnectionThread::start()
{
if(worker) {
if(worker->isRunning()) {
worker->quit();
}
delete worker;
}
worker = new QThread;
connect(worker, SIGNAL(started()), this, SLOT(run()));
worker->start();
}
void
ConnectionThread::run()
{
emit executeSignal();
}
void
ConnectionThread::loginProcess()
{
m_connectionPtr->Connect();
}
現在的這個實例在主界面線程被創建,但當loginProcess最終調用,它阻止,直到完成這會導致我的應用程序的GUI掛起。請注意,如果我把邏輯代碼直接進入運行功能沒有區別觀察和省略信號像如下: -
void
ConnectionThread::run()
{
m_connectionPtr->Connect();
}
所以我認爲我需要移動「這個」的主題命名爲工人,是這樣的:
void
ConnectionThread::start()
{
if(worker) {
if(worker->isRunning()) {
worker->quit();
}
delete worker;
}
worker = new QThread;
this->moveToThread(worker);
connect(worker, SIGNAL(started()), this, SLOT(run()));
worker->start();
}
,但是這給了我
QObject: Cannot create children for a parent that is in a different thread.
我不知道這是爲什麼然而,由於ConnectionThread的實例被創建的情況和它的啓動函數被調用來自另一個線程。我們稱之爲其他線程GuiThread。這意味着GuiThread具有控制權,因此應該能夠將ConnectionThread實例的所有權轉移給工作線程。
最後一個可能性,我還沒有充分挖掘卻又是移動m_connectionPtr的工作線程的可能性..
在上面的圖案,我怎麼可能會提高它,通常我怎麼能防止任何想法它阻止?
連接線程是否從任何東西派生? ConnectionPtr是否是您希望在另一個線程中執行的作業的類? Againg,是conncetionPtr派生自任何東西從您發佈的示例中,它不是很清楚... –
我認爲這一點至關重要的是,如果實際上ConnectionThread對象不應該移動到單獨的線程。我看不到你想要委派給工人的行爲。現在我沒有看到工人正在發生什麼事情。 – Adrian
ConnectionThread從QObject派生。並且也從QObject派生的ConnectionPtr完成了我想在另一個線程中執行的工作。 –