QWaitConditon应用
来源:互联网 发布:怎么导入天刀捏脸数据 编辑:程序博客网 时间:2024/06/07 23:47
背景:在编写多线程的时候,有的线程需要一直的执行下去,永不停止,但是有的线程是需要它能够在我们的控制下自由地的开始和暂停。那么常用的方法就是让线程等待一个标志,标志为假就睡眠,当标志为真就唤醒。Qt提供了类似的机制,那就是QWaitConditon类。
一、QWaitConditon简介
线程如何睡眠?
调用QWaitCondition的wait函数将使得调用它的线程进入睡眠状态
线程如何醒来?
在另外的线程中调用QWaitConditon的wakeOne或者wakeAll方法将唤醒等待它的线程
二、代码示例
线程类
//workthread.h#include <QThread>class WorkThread : public QThread{ Q_OBJECTpublic: explicit WorkThread(QObject *parent = 0);protected: void run();private: int i;};//workthread.cpp#include "WorkThread.h"#include <qwaitcondition>#include <qmutex>#include <qtdebug>QWaitCondition pressed;QMutex mutex;bool bStart;WorkThread::WorkThread(QObject *parent) : QThread(parent){ i=0; bStart=true;}void WorkThread::run(){ while(1) { if(bStart==false) //当bStart变量为假的时候才让线程睡眠 { mutex.lock(); pressed.wait(&mutex); //线程等待press.wakeOne或者press.wakeAll而睡眠 mutex.unlock(); } sleep(1); //控制qDebug打印频率 qDebug()<<"work thread is running:"<<i++<<'\n';//线程的主体,在Qt的调试区打印出来,代表线程的进行 }}
界面类
//dialog.h#include <QDialog>namespace Ui {class Dialog;}class Dialog : public QDialog{ Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog(); private slots: void on_pushButton_clicked();private: Ui::Dialog *ui;};//dialog.cpp#include "dialog.h"#include "ui_dialog.h"#include #include extern bool bStart;extern QWaitCondition pressed;extern QMutex mutex;Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog){ ui->setupUi(this);}Dialog::~Dialog(){ delete ui;}void Dialog::on_pushButton_clicked(){ if(bStart==false) //点击按钮前开始状态为假 { bStart=true; //点击按钮后开始状态为真 ui->pushButton->setText(tr("暂停线程"));//按钮的文字显示"暂停线程" pressed.wakeAll(); //唤醒因pressed.wait而睡眠的线程 } else //点击按钮前开始状态为真 { bStart=false; //点击按钮后开始状态为假 ui->pushButton->setText(tr("开始线程"));//按钮的文字显示为"开始线程" }}
主函数
#include "dialog.h"#include <QApplication>#include <QTextCodec>#include <WorkThread.h>int main(int argc, char *argv[]){ QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8")); WorkThread work; work.start(); Dialog w; w.show(); return a.exec();}界面UI
效果:
开始运行的时候按钮显示暂停线程,这时候可以看见Qt调用窗口有打印信息出现,说明线程在不停的运行
点击按钮,文字显示为开始线程,现在打印信息也没有了,说明线程没有运行了
再次点击按钮,文字再次显示为暂停线程,这个时候打印信息又开始显示了,并且接着上面的数字
存在问题:
当bStart为假的时候,线程并不是立即休眠,而是要等到线程的程序执行到判断bStart的时候才会睡眠,所以有一定的延时
- QWaitConditon应用
- 应用
- 应用
- 应用
- 应用
- 应用
- 应用
- 应用
- 网站应用/ 项目应用
- slam应用及应用
- android 应用跳应用
- VML应用
- Ant应用
- 批处理应用
- 应用 Remoting
- 数据压缩 -- 应用
- jstl应用
- Ant应用
- Vim+cscope+ctags+tags阅读源代码
- 内部类(闭包与回调)
- 笔记本参数解读
- 2013.9.24
- Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)
- QWaitConditon应用
- c语言实现学生成绩录入,主要是对指针的运用
- IOS 制作启动画面
- 结构体最后的长度为0或1数组的作用
- <meta name="format-detection" content="telephone=no">等
- flex 中embed用法
- 挑战drupal(1)
- E2238 Multiple declaration for 'fd_set' 报错
- Introducing VMware NSX – The Platform For Network Virtualization