2013-04-25 94 views
1

我嘗試使用QThread的,但我不能這樣做:( 我的樣品線程:QThread的 - 與它的問題(初學者)

#include "worker.h" 
#include "mainwindow.h" 
#include <QDebug> 
Worker::Worker() {} 

Worker::~Worker() { 
    qDebug() << "Worker ends."; 
} 

void Worker::run() { 
    qDebug() << "Worker start."; 
    sleep(2); 
    emit finished(); 
} 

和代碼on_btnStart_clicked():

Worker *worker = new Worker; 
QThread *workerThread = new QThread(this); 
connect(workerThread, SIGNAL(started()), worker, SLOT(start())); 
connect(workerThread, SIGNAL(finished()), worker, SLOT(quit())); 
worker->moveToThread(workerThread); 
workerThread->start(); 

工作人員啓動,但永遠不會結束(如果我關閉應用程序,我得到QThread: Destroyed while thread is still running。 另一個問題 - 我怎麼可以在線程和我的應用程序之間傳輸數據?我想使用QThread的QLabel(例如:計時器)。任何我可以毫無疑問地complile的好教程LEMS。 任何人都可以幫助我?
而且,如果我可以問一下,我怎麼可以像onCreate()那樣啓動線程來創建表單?我想創建一個簡單的計時器來計算應用程序運行的時間。
Regards

+0

您將'workerThread :: started()'連接到'Worker :: start()',但是在您提供的代碼中有'Worker :: run()',而不是'Worker :: start()'。檢查connect'是否返回true或false。 – Paul 2013-04-25 19:13:42

+1

_我找不到任何好的教程,我可以complile沒有問題。任何人都可以幫助我嗎?_不是/examples/threads夠好嗎?此外,您可能想要閱讀qt-project中的[Threading Basics](http://qt-project.org/doc/qt-4.8/thread-basics.html)博文。 – Paul 2013-04-25 19:26:07

+0

@Paul - 'Object :: connect:在mainwindow.cpp中沒有這樣的插槽QThread :: run():22';在/ usr/share/qt4/doc我找不到任何東西;在qt-project.org文檔我找到像我這樣的代碼,但它沒有工作;謝謝你的鏈接,我會試試 – aso 2013-04-25 19:32:47

回答

0

您應該仔細閱讀This文章。

看看Qt 4.8 QThread文檔的第一個代碼示例。它有許多線路板只是爲了在線程中運行一些代碼。而且還有一個漏洞:QThread永遠不會退出並被摧毀。

提交的補丁已被接受,但他轉發給你的href鏈接仍顯示舊代碼。

This patch snippet diff在右側顯示有效的方法。

它顯示了兩種方法,子分類QThread和使用QObject->Worker 您可以使用它作爲您的代碼基礎上的示例。正如他在博客中提到的那樣,應用適合您的要求的方法。