• 14855阅读
  • 8回复

用QThread创建的线程如何关闭????? [复制链接]

上一主题 下一主题
离线bazzi2011
 

只看楼主 倒序阅读 楼主  发表于: 2014-11-06
  1. 定义了一个线程
  2. MyThread::MyThread(QObject *parent) :
  3.     QThread(parent)
  4. {
  5. }
  6. void MyThread::run()
  7. {
  8.     for(int i = 0; i < 30000; ++i)
  9.     {
  10.          qDebug() << i << endl;
  11.     }
  12.     exec();
  13. }
  14. 在mainwindow构造函数里面初始化它
  15. workerThread = new MyThread(this);
  16. 然后在一个按钮中开始执行
  17. void MainWindow::on_pushButton_clicked()
  18. {
  19.     if(workerThread->isRunning())
  20.     {
  21.         qDebug() << "线程仍在执行中";
  22.         return;
  23.     }
  24.     workerThread->start();
  25. }
  26. 但我当run输完0---30000后,却依然存在,isRunning()依然返回true,这到底是怎么回事啊???该怎样结束线程呢????





离线dbzhang800

只看该作者 1楼 发表于: 2014-11-06
因为你的run() 内加了一个while循环啊!!

要么去掉那句exec() ,要么通过其他方式让其退出exec()
离线bazzi2011

只看该作者 2楼 发表于: 2014-11-06
回 dbzhang800 的帖子
dbzhang800:因为你的run() 内加了一个while循环啊!!
要么去掉那句exec() ,要么通过其他方式让其退出exec() (2014-11-06 15:27)

抱歉,我错了,去掉exec()的确退出了,但在线程执行期间却没有办法防止重复点击按钮啊???

我点一下按钮,在输出数字的过程中再次点击按钮,if(workerThread->isRunning())这句代码不起作用啊???
在线uidab

只看该作者 3楼 发表于: 2014-11-06
回 bazzi2011 的帖子
bazzi2011:抱歉,我错了,去掉exec()的确退出了,但在线程执行期间却没有办法防止重复点击按钮啊???
我点一下按钮,在输出数字的过程中再次点击按钮,if(workerThread->isRunning())这句代码不起作用啊???
 (2014-11-06 15:39) 

把按钮变灰
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线bazzi2011

只看该作者 4楼 发表于: 2014-11-06
回 uidab 的帖子
uidab:把按钮变灰 (2014-11-06 15:46) 

我也想过这个办法啊,但线程中不是不能操控ui么?如果在按钮中第一句   ui->pushButton->setEnabled(false); 那么我何时才能将其再置为可用呢?也就是说我怎样才能知道run已经运行完毕了呢?
离线realfan

只看该作者 5楼 发表于: 2014-11-06
回 bazzi2011 的帖子
bazzi2011:我也想过这个办法啊,但线程中不是不能操控ui么?如果在按钮中第一句   ui->pushButton->setEnabled(false); 那么我何时才能将其再置为可用呢?也就是说我怎样才能知道run已经运行完毕了呢? (2014-11-06 15:51) 

在click中,将按钮变灰。

connect(workerThread, SIGNAL(finished()), this, SLOT(OnThreadFinished()));
关联线程的finished信号,收到信号后,再将按钮变为可用。
离线bazzi2011

只看该作者 6楼 发表于: 2014-11-07
回 realfan 的帖子
realfan:在click中,将按钮变灰。
connect(workerThread, SIGNAL(finished()), this, SLOT(OnThreadFinished()));
关联线程的finished信号,收到信号后,再将按钮变为可用。 (2014-11-06 16:40) 

我明白了!当run()函数中的代码运行完成之后,线程就自动结束, 无需再手动exit(0),对吧?

还有一个问题,如果我想要线程回传给主窗口一些数据,是不是要自己写一个信号Myfinished(int)、然后在run()函数最后一句发出emit Myfinished(整型)才可以实现?
离线彩阳

只看该作者 7楼 发表于: 2014-11-07
回 bazzi2011 的帖子
bazzi2011:我明白了!当run()函数中的代码运行完成之后,线程就自动结束, 无需再手动exit(0),对吧?
还有一个问题,如果我想要线程回传给主窗口一些数据,是不是要自己写一个信号Myfinished(int)、然后在run()函数最后一句发出emit Myfinished(整型)才可以实现? (2014-11-07 09:48) 

对,就这样操作。在执行方法之前将信号和槽连接起来。
上海Qt开发联盟,热忱地欢迎你的加入!
离线realfan

只看该作者 8楼 发表于: 2014-11-07
回 bazzi2011 的帖子
bazzi2011:我明白了!当run()函数中的代码运行完成之后,线程就自动结束, 无需再手动exit(0),对吧?
还有一个问题,如果我想要线程回传给主窗口一些数据,是不是要自己写一个信号Myfinished(int)、然后在run()函数最后一句发出emit Myfinished(整型)才可以实现? (2014-11-07 09:48) 

run 函数运行完,就是线程结束。但如果run函数内有无限循环或exec(),则需要额外的退出代码。
可以按你说的方法传数据。但要注意你的Myfinished不是线程finished,最好不叫finished,以免混淆,比如叫XXCompleted
快速回复
限100 字节
 
上一个 下一个