• 6782阅读
  • 6回复

[提问]QTread问题 [复制链接]

上一主题 下一主题
离线kaon
 

只看楼主 倒序阅读 楼主  发表于: 2012-06-17
  1. #ifndef MYTHREAD_H
  2. #define MYTHREAD_H
  3. #include <QThread>
  4. class MyThread : public QThread
  5. {
  6.     Q_OBJECT
  7. public:
  8.     explicit MyThread(QObject *parent = 0);
  9.     void run();
  10.     
  11. signals:
  12.     void aboutToQuitApp();
  13.     
  14. public slots:
  15.     void killMe();
  16.     
  17. };
  18. #endif // MYTHREAD_H

  1. #include "mythread.h"
  2. #include <QDebug>
  3. MyThread::MyThread(QObject *parent) :
  4.     QThread(parent)
  5. {
  6. }
  7. void MyThread::run()
  8. {
  9.     qDebug() << "running";
  10.     //exec();
  11. }
  12. void MyThread::killMe()
  13. {
  14.     qDebug() << "kill me";
  15.     emit aboutToQuitApp();
  16. }


  1. #include <QtCore/QCoreApplication>
  2. #include <QDebug>
  3. #include <QTimer>
  4. #include "mythread.h"
  5. int main(int argc, char *argv[])
  6. {
  7.     QCoreApplication a(argc, argv);
  8.     MyThread x;
  9.     x.start();
  10.     QTimer *timer = new QTimer();
  11.     QObject::connect(timer, SIGNAL(timeout()), &x, SLOT(killMe()));
  12.     timer->start(3000);
  13.     QObject::connect(&x,SIGNAL(aboutToQuitApp()),qApp,SLOT(quit()));
  14.     x.wait();
  15.     return a.exec();
  16. }


问题是。。MyThread里的run下面,按照文档,exec是必须的,以便进入event loop, 现在是,没有exec可以使用main里的qtimer,至退出,反而在run里加了exec,貌似死在了线程的exec里,没反应了


离线ppdayz

只看该作者 1楼 发表于: 2012-06-17
回 楼主(kaon) 的帖子
关于QThread。。这个东西很复杂。。。推荐你去看3篇文章,都不是我写的
是dbzhang800的博客,很好
http://hi.baidu.com/dbzhang800/item/c14c97dd15318d17e1f46f41
http://hi.baidu.com/dbzhang800/item/e8bcc0436355daab60d7b944
http://hi.baidu.com/dbzhang800/item/1e931317d37d71dcbe904247
离线ninsun

只看该作者 2楼 发表于: 2012-06-17
x.wait();
会一直的等待,知道线程被结束.
可是你的代码里没有任何结束线程的语句.
于是程序就会不停的等待下去了...

void MyThread::killMe()
里面加一个terminate()结束线程吧... 希望我没有记错函数名...
离线kaon

只看该作者 3楼 发表于: 2012-06-17
啊,貌似是wait的问题,
不过撇开wait,我没用在run里添加exec(),也能用connect信号和槽,甚是奇怪
离线ffii4455

只看该作者 4楼 发表于: 2012-06-18
不知道应该如何收藏帖子啊。。。只能站位留言了
离线chenjun0211

只看该作者 5楼 发表于: 2014-05-20
回 ninsun 的帖子
ninsun:x.wait();
会一直的等待,知道线程被结束.
可是你的代码里没有任何结束线程的语句.
于是程序就会不停的等待下去了...
....... (2012-06-17 21:17) 

使用exec()启动的安全退出线程可以quit();wait(); ,terminate()会立即结束线程会比较危险。
离线hyh0lh

只看该作者 6楼 发表于: 2014-05-20
信号和槽的使用应该是你添加了Q_OBJECT宏引起的。
我使用的是4.8.4,很少在run里使用exec()这种显示代码,都是自己写while()循环加标记的方式来做。这样可控性更好,而且不会让信号和槽乱飞,理不清逻辑状况。
快速回复
限100 字节
 
上一个 下一个