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中的文本框中。 但他們出現在線程完成後。不在計算過程中,不管它有多長。
並收到所有消息。所以它會將它們保存在某個緩衝區中,並在最後更新文本。
我在做什麼錯,在哪種情況下可能發生?它如何測試它?
我有點困惑,爲什麼你明確地使用排隊連接。我認爲,默認是沒問題的。另外,您是否可以在Raytracer的線程中顯示計算代碼,特別是關於信號發射? – lpapp