2014-02-23 42 views
0

我有一個QObject派生類下繁重的計算。 我通過GUI中的一個按鈕將它移動到我的新qthread中,它僅用於執行該計算。QThread信號到GUI接收但響應不是異步的

圖形用戶界面應該是等待工作線程在循環中的消息(因爲在執行按鈕插槽後,它只是去那裏)。

我通過信號和插槽機制如下發送消息。 我有一個泛型類控制器執行的線程的創建和它與GUI(主窗口)連接:

QThread* thread = new QThread; 
Raytracer* worker = new Raytracer(); 
worker->moveToThread(thread); 

QObject::connect(thread, &QThread::started, worker, &Raytracer::execute);//, Qt::QueuedConnection); 
QObject::connect(worker, &Raytracer::textEmitted, gui_, &MainWindow::addText, Qt::QueuedConnection); 
QObject::connect(worker, &Raytracer::hitEmitted, gui_, &MainWindow::hitReceived, Qt::QueuedConnection); 
QObject::connect(worker, &Raytracer::finished, worker, &Raytracer::deleteLater, Qt::QueuedConnection); 
QObject::connect(worker, &Raytracer::finished, thread, &QThread::quit, Qt::QueuedConnection); 
QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater, Qt::QueuedConnection); 
QObject::connect(thread, &QThread::finished, this, &MainController::finishedCalculation, Qt::QueuedConnection); 


thread->start(); 

關於該類光線跟蹤:

class Raytracer : public QObject 
{ 
Q_OBJECT 

在它發射喜歡的東西的計算這樣的:

emit textEmitted(QString("Number %1\n").arg(number)); 

和GUI接收此信號:

void addText(const QString& text) { outputBox_->append(text); } 

信號被接收並正確添加到GUI中的文本框中。 但他們出現在線程完成後。不在計算過程中,不管它有多長。

並收到所有消息。所以它會將它們保存在某個緩衝區中,並在最後更新文本。

我在做什麼錯,在哪種情況下可能發生?它如何測試它?

+0

我有點困惑,爲什麼你明確地使用排隊連接。我認爲,默認是沒問題的。另外,您是否可以在Raytracer的線程中顯示計算代碼,特別是關於信號發射? – lpapp

回答

1

GUI線程被其他東西阻塞,或者您的其他線程在工作時不發出信號,但只在最後。你沒有顯示足夠的代碼來診斷錯誤。

我有a stand-alone example幾乎做你想做的事情。所需的唯一更改是在runTest(在emit之後)末尾添加QThread::msleep(1000);。這將接近需要1秒執行的測試。