一个Qt线程的例子,用于说明QWaitCondition的作用
描述可能比较麻烦,还是直接上代码吧!
main.cpp
- #include <QApplication>
- #include "mainpage.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MainPage page;
- page.show();
- return a.exec();
- }
mainpage.h
- #ifndef MAINPAGE_H
- #define MAINPAGE_H
- #include <QWidget>
- #include "thread1.h"
- class MainPage : public QWidget
- {
- Q_OBJECT
- public:
- explicit MainPage(QWidget *parent = 0);
- ~MainPage();
- thread1 *th1;
- private slots:
- void doClick();
- };
- #endif // MAINPAGE_H
thread1.h
- #ifndef THREAD1_H
- #define THREAD1_H
- #include <QThread>
- #include <QWaitCondition>
- #include "thread2.h"
- #include <QMutex>
- class thread1 : public QThread
- {
- Q_OBJECT
- public:
- explicit thread1(QObject *parent = 0);
- void run();
- void wakeFunc();
- private:
- QWaitCondition cond;
- QMutex mutex;
- thread2 th2;
- };
- #endif // THREAD1_H
thread2.h
- #ifndef THREAD2_H
- #define THREAD2_H
- #include <QThread>
- class thread2 : public QThread
- {
- Q_OBJECT
- public:
- explicit thread2(QObject *parent = 0);
- void run();
- };
- #endif // THREAD2_H
mainpage.cpp
- #include "mainpage.h"
- #include <QDebug>
- #include <QPushButton>
- MainPage::MainPage(QWidget *parent) :
- QWidget(parent)
- {
- th1=new thread1;
- this->resize(100, 40);
- QPushButton *pb=new QPushButton("按钮", this);
- pb->resize(50, 20);
- pb->move(10, 10);
- connect(pb, SIGNAL(clicked()), this, SLOT(doClick()));
- }
- MainPage::~MainPage()
- {
- }
- void MainPage::doClick()
- {
- qDebug()<<"button clicked!";
- th1->wakeFunc();
- }
thread1.cpp
- #include "thread1.h"
- #include <QDebug>
- thread1::thread1(QObject *parent) :
- QThread(parent)
- {
- }
- void thread1::wakeFunc()
- {
- if(!isRunning()){
- start();
- }else{
- cond.wakeOne();
- }
- }
- void thread1::run()
- {
- static int x=0;
- qDebug()<<"进入thread1的run函数";
- while(true){
- qDebug()<<"-------> 1 <---------";
- mutex.lock();
- if(++x>3) th2.start();
- qDebug() << "进入thread1的while循环,x值为"<<x;
- cond.wait(&mutex); //当处于wait状态时mutex会被暂时释放,并阻塞在这个地方;当线程被cond.wakeOne()等唤醒时,mutex又会被重新锁定,并继续运行
- mutex.unlock();
- qDebug()<<"-------> 2 <---------";
- }
- }
thread2.cpp
- #include "thread2.h"
- #include <QDebug>
- thread2::thread2(QObject *parent) :
- QThread(parent)
- {
- }
- void thread2::run()
- {
- qDebug()<<"线程2已激活";
- }
运行效果:
(1)按钮点击一次时的调试输出
(3)按钮点击多次时的调试输出
结论:借助网友的说法,在debug里面可以看到线程1的run函数只进入了一次,虽然我们调用了它很多次。也就是说使用waitCondition可以让线程进入休眠而不用退出。
一个Qt线程的例子,用于说明QWaitCondition的作用的更多相关文章
- qt 中创建一个工作线程(例子)
当一个事件需要很长的处理时间,就创建一个工作线程,防止主界面卡死. 1.新建一个QT的gui项目,里面包含main.cpp,mainwindow.h,mainwindow.cpp,mainwindow ...
- 一个Java线程小例子(仿火车票售卖)
public class MyThread extends Thread{ private static int ticket=100; public void run(){ for(int i=0; ...
- 一个LinkedBlockingQueue线程安全的例子
一个LinkedBlockingQueue线程安全的例子 package llj.mf.ace; import java.util.ArrayList; import java.util.HashSe ...
- QT线程使用收集示例
关于多线程问题: Qt和Boost做跨平台的线程封装,OpenMP主要做并行计算,让不精通多线程的人也能高效地利用CPU的计算能力.个人倾向于用boost.thread, boost.mpi. 一 ...
- qt线程(转)----这篇很专业!
本文档是自己所整理的一份文档,部分是原创,还转贴了网上的一此资料(已经标明了),(难点是多线程的编写),是有源代码的,大家可以作为参考,用到的知识是视频采集,压缩解压(xvid),实时传输(jrtp) ...
- QT核心编程之Qt线程 (c)
QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类 ...
- Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)
Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...
- Qt 线程基础(QThread、QtConcurrent等)
[-] 使用线程 何时使用其他技术替代线程 应该使用 Qt 线程的哪种技术 Qt线程基础 QObject与线程 使用互斥量保护数据的完整 使用事件循环防止数据破坏 处理异步执行 昨晚看Qt的Manua ...
- Qt 线程基础
(转自:http://my.oschina.net/laopiao/blog/88158) 何谓线程? 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据 ...
随机推荐
- hadoop批量命令脚本xrsync.sh传输脚本
1.xrsync.sh脚本 #!/bin/bash if [[ $# -lt 1 ]] ; then echo no params ; exit ; fi p=$1 #echo p=$p dir=`d ...
- RabbitMQ入门教程(一):安装和常用命令
原文:RabbitMQ入门教程(一):安装和常用命令 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...
- luogu P4383 [九省联考2018]林克卡特树lct
传送门 题目操作有点奇怪,不过可以发现这就是把树先变成\(k+1\)个连通块,然后每个连通块选一条路径(本题中一个点也是一条路径),然后依次接起来.所以实际上要求的是选出\(k+1\)条点不相交的路径 ...
- PHP foreach 引用 &
以前用foreach,总喜欢在第二次遍历时改变value的拼写,比如 $x = array("a", "b", "c"); foreach ...
- 吴恩达机器学习101:SVM优化目标
1.为了描述SVM,需要从logistic回归开始进行学习,通过改变一些小的动作来进行支持向量机操作.在logistic回归中我们熟悉了这个假设函数以及右边的sigmoid函数,下式中z表示θ的转置乘 ...
- mysql远程连接错误10038--navicat for mysql (10038)
1.确定3306端口是否对外开放 如果是阿里云服务器,需要添加安全组规则 2.授权 执行sql,账号密码按照自己服务器而定 grant all privileges on *.* to 'root'@ ...
- python核心编程正则表达式练习题1-2匹配由单个空格分隔的任意单词对,也就是性和名
# 匹配由单个空格分隔的任意单词对,也就是姓和名 import re patt = '[A-Za-z]+ [A-Za-z]+' # 方法一 +加号操作符匹配它左边的正则表达式至少出现一次的情况 # p ...
- 清北学堂清华大学钟皓曦神仙讲课day3摘要
---恢复内容开始--- 今天全是DP awsl,真的好难 先从斐波那契开始: dp:满足有一个状态边界条件(f[0]=0,f[1]=1) 边界条件:不需要计算其他状态的值而可以直接得出的状态或者最底 ...
- 【NOIP2016提高A组模拟9.14】数列编辑器
题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...
- Redis 历史版本下载URL
Redis 历史版本下载URL: http://download.redis.io/releases/ Redis和RedisClient 官网下载方式: https://blog.51cto.com ...