QWaitConditon应用


背景:在编写多线程的时候,有的线程需要一直的执行下去,永不停止,但是有的线程是需要它能够在我们的控制下自由地的开始和暂停。那么常用的方法就是让线程等待一个标志,标志为假就睡眠,当标志为真就唤醒。Qt提供了类似的机制,那就是QWaitConditon类。

一、QWaitConditon简介

线程如何睡眠?

调用QWaitCondition的wait函数将使得调用它的线程进入睡眠状态

线程如何醒来?

在另外的线程中调用QWaitConditon的wakeOne或者wakeAll方法将唤醒等待它的线程

二、代码示例

线程类

  1. //workthread.h  
  2. #include <QThread>  
  3. class WorkThread : public QThread  
  4. {  
  5.     Q_OBJECT  
  6. public:  
  7.     explicit WorkThread(QObject *parent = 0);  
  8. protected:  
  9.     void run();  
  10. private:  
  11.     int i;  
  12. };  
  13. //workthread.cpp  
  14. #include "WorkThread.h"  
  15. #include <qwaitcondition>  
  16. #include <qmutex>  
  17. #include <qtdebug>  
  18. QWaitCondition pressed;  
  19. QMutex mutex;  
  20. bool bStart;  
  21.   
  22. WorkThread::WorkThread(QObject *parent) : QThread(parent)  
  23. {  
  24.     i=0;  
  25.     bStart=true;  
  26. }  
  27.   
  28. void WorkThread::run()  
  29. {  
  30.     while(1)  
  31.     {  
  32.       if(bStart==false)                             //当bStart变量为假的时候才让线程睡眠  
  33.       {  
  34.         mutex.lock();  
  35.         pressed.wait(&mutex);                       //线程等待press.wakeOne或者press.wakeAll而睡眠  
  36.         mutex.unlock();  
  37.       }  
  38.      sleep(1);                                      //控制qDebug打印频率  
  39.      qDebug()<<"work thread is running:"<<i++<<'\n';//线程的主体,在Qt的调试区打印出来,代表线程的进行  
  40.     }  
  41. }  

界面类

  1. //dialog.h  
  2. #include <QDialog>  
  3.   
  4. namespace Ui {  
  5. class Dialog;  
  6. }  
  7.   
  8. class Dialog : public QDialog  
  9. {  
  10.     Q_OBJECT  
  11.       
  12. public:  
  13.     explicit Dialog(QWidget *parent = 0);  
  14.     ~Dialog();  
  15.       
  16. private slots:  
  17.     void on_pushButton_clicked();  
  18.   
  19. private:  
  20.     Ui::Dialog *ui;  
  21.   
  22. };  
  23. //dialog.cpp  
  24. #include "dialog.h"  
  25. #include "ui_dialog.h"  
  26. #include   
  27. #include   
  28.   
  29. extern bool bStart;  
  30. extern QWaitCondition pressed;  
  31. extern QMutex mutex;  
  32.   
  33. Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)  
  34. {  
  35.     ui->setupUi(this);  
  36. }  
  37.   
  38. Dialog::~Dialog()  
  39. {  
  40.     delete ui;  
  41. }  
  42.   
  43. void Dialog::on_pushButton_clicked()  
  44. {  
  45.     if(bStart==false)                           //点击按钮前开始状态为假  
  46.     {  
  47.         bStart=true;                            //点击按钮后开始状态为真  
  48.         ui->pushButton->setText(tr("暂停线程"));//按钮的文字显示"暂停线程"  
  49.         pressed.wakeAll();                      //唤醒因pressed.wait而睡眠的线程  
  50.     }  
  51.     else                                        //点击按钮前开始状态为真  
  52.     {  
  53.         bStart=false;                           //点击按钮后开始状态为假  
  54.         ui->pushButton->setText(tr("开始线程"));//按钮的文字显示为"开始线程"  
  55.     }  
  56. }  

主函数

  1. #include "dialog.h"  
  2. #include <QApplication>  
  3. #include <QTextCodec>  
  4. #include <WorkThread.h>  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     QApplication a(argc, argv);  
  9.     QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));  
  10.   
  11.     WorkThread work;  
  12.     work.start();  
  13.   
  14.     Dialog w;  
  15.     w.show();  
  16.       
  17.     return a.exec();  
  18. }  
界面UI

                           

效果:

开始运行的时候按钮显示暂停线程,这时候可以看见Qt调用窗口有打印信息出现,说明线程在不停的运行

点击按钮,文字显示为开始线程,现在打印信息也没有了,说明线程没有运行了

再次点击按钮,文字再次显示为暂停线程,这个时候打印信息又开始显示了,并且接着上面的数字

存在问题:

当bStart为假的时候,线程并不是立即休眠,而是要等到线程的程序执行到判断bStart的时候才会睡眠,所以有一定的延时


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值