Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7691020
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2013-12-30 10:53:32

Qt 使用QThread 来管理线程。


要使用QThread开始一个线程,我们可以创建它的一个子类,然后覆盖其QThread::run()函数:

点击(此处)折叠或打开

  1. class Thread : public QThread
  2. {
  3. protected:
  4.     void run()
  5.     {
  6.         /* 线程的相关代码 */
  7.     }
  8. };

然后我们这样使用新建的类来开始一个新的线程:

Thread *thread = new Thread;

thread->start(); // 使用 start() 开始新的线程


下面来看一个简单的例子:

点击(此处)折叠或打开

  1. class WorkerThread : public QThread
  2. {
  3.     Q_OBJECT
  4. public:
  5.     WorkerThread(QObject *parent = 0)
  6.         : QThread(parent)
  7.     {
  8.     }
  9. protected:
  10.     void run()
  11.     {
  12.         for (int i = 0; i < 1000000000; i++);
  13.         emit done();
  14.     }
  15. signals:
  16.     void done();
  17. };
  18.  
  19. MainWindow::MainWindow(QWidget *parent)
  20.     : QMainWindow(parent)
  21. {
  22.     QWidget *widget = new QWidget(this);
  23.     QVBoxLayout *layout = new QVBoxLayout;
  24.     widget->setLayout(layout);
  25.     lcdNumber = new QLCDNumber(this);
  26.     layout->addWidget(lcdNumber);
  27.     QPushButton *button = new QPushButton(tr("Start"), this);
  28.     layout->addWidget(button);
  29.     setCentralWidget(widget);
  30.  
  31.     QTimer *timer = new QTimer(this);
  32.     connect(timer, &QTimer::timeout, [=]() {
  33.         static int sec = 0;
  34.         lcdNumber->display(QString::number(sec++));
  35.     });
  36.  
  37.     WorkerThread *thread = new WorkerThread(this);
  38.     connect(thread, &WorkerThread::done, timer, &QTimer::stop);
  39.     connect(thread, &WorkerThread::finished, thread, &WorkerThread::deleteLater); //finished()信号是系统发出的
  40.     connect(button, &QPushButton::clicked, [=]() {
  41.         timer->start(1);
  42.         thread->start(); //使用QThread::start()函数启动一个线程
  43.     });
  44. }

WorkerThread继承自QThread类,重写了其run()函数。我们可以认为,run()函数就是新的线程需要执行的代码。


阅读参考:
QT 多线程程序设计
 
返回目录:
Qt学习整理
阅读(30385) | 评论(0) | 转发(3) |
0

上一篇:Qt进程

下一篇:QT网络

给主人留下些什么吧!~~