2013-04-25 55 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 您可以使用它作为您的代码基础上的示例。正如他在博客中提到的那样,应用适合您的要求的方法。