描述可能比较麻烦,还是直接上代码吧!

main.cpp

  1. #include <QApplication>
  2. #include "mainpage.h"
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. MainPage page;
  7. page.show();
  8. return a.exec();
  9. }

mainpage.h

  1. #ifndef MAINPAGE_H
  2. #define MAINPAGE_H
  3. #include <QWidget>
  4. #include "thread1.h"
  5. class MainPage : public QWidget
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit MainPage(QWidget *parent = 0);
  10. ~MainPage();
  11. thread1 *th1;
  12. private slots:
  13. void doClick();
  14. };
  15. #endif // MAINPAGE_H

thread1.h

  1. #ifndef THREAD1_H
  2. #define THREAD1_H
  3. #include <QThread>
  4. #include <QWaitCondition>
  5. #include "thread2.h"
  6. #include <QMutex>
  7. class thread1 : public QThread
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit thread1(QObject *parent = 0);
  12. void run();
  13. void wakeFunc();
  14. private:
  15. QWaitCondition cond;
  16. QMutex mutex;
  17. thread2 th2;
  18. };
  19. #endif // THREAD1_H

thread2.h

  1. #ifndef THREAD2_H
  2. #define THREAD2_H
  3. #include <QThread>
  4. class thread2 : public QThread
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit thread2(QObject *parent = 0);
  9. void run();
  10. };
  11. #endif // THREAD2_H

mainpage.cpp

  1. #include "mainpage.h"
  2. #include <QDebug>
  3. #include <QPushButton>
  4. MainPage::MainPage(QWidget *parent) :
  5. QWidget(parent)
  6. {
  7. th1=new thread1;
  8. this->resize(100, 40);
  9. QPushButton *pb=new QPushButton("按钮", this);
  10. pb->resize(50, 20);
  11. pb->move(10, 10);
  12. connect(pb, SIGNAL(clicked()), this, SLOT(doClick()));
  13. }
  14. MainPage::~MainPage()
  15. {
  16. }
  17. void MainPage::doClick()
  18. {
  19. qDebug()<<"button clicked!";
  20. th1->wakeFunc();
  21. }

thread1.cpp

  1. #include "thread1.h"
  2. #include <QDebug>
  3. thread1::thread1(QObject *parent) :
  4. QThread(parent)
  5. {
  6. }
  7. void thread1::wakeFunc()
  8. {
  9. if(!isRunning()){
  10. start();
  11. }else{
  12. cond.wakeOne();
  13. }
  14. }
  15. void thread1::run()
  16. {
  17. static int x=0;
  18. qDebug()<<"进入thread1的run函数";
  19. while(true){
  20. qDebug()<<"-------> 1 <---------";
  21. mutex.lock();
  22. if(++x>3) th2.start();
  23. qDebug() << "进入thread1的while循环,x值为"<<x;
  24. cond.wait(&mutex);   //当处于wait状态时mutex会被暂时释放,并阻塞在这个地方;当线程被cond.wakeOne()等唤醒时,mutex又会被重新锁定,并继续运行
  25. mutex.unlock();
  26. qDebug()<<"-------> 2 <---------";
  27. }
  28. }

thread2.cpp

  1. #include "thread2.h"
  2. #include <QDebug>
  3. thread2::thread2(QObject *parent) :
  4. QThread(parent)
  5. {
  6. }
  7. void thread2::run()
  8. {
  9. qDebug()<<"线程2已激活";
  10. }

运行效果:

(1)按钮点击一次时的调试输出

(3)按钮点击多次时的调试输出

结论:借助网友的说法,在debug里面可以看到线程1的run函数只进入了一次,虽然我们调用了它很多次。也就是说使用waitCondition可以让线程进入休眠而不用退出。

一个Qt线程的例子,用于说明QWaitCondition的作用的更多相关文章

  1. qt 中创建一个工作线程(例子)

    当一个事件需要很长的处理时间,就创建一个工作线程,防止主界面卡死. 1.新建一个QT的gui项目,里面包含main.cpp,mainwindow.h,mainwindow.cpp,mainwindow ...

  2. 一个Java线程小例子(仿火车票售卖)

    public class MyThread extends Thread{ private static int ticket=100; public void run(){ for(int i=0; ...

  3. 一个LinkedBlockingQueue线程安全的例子

    一个LinkedBlockingQueue线程安全的例子 package llj.mf.ace; import java.util.ArrayList; import java.util.HashSe ...

  4. QT线程使用收集示例

    关于多线程问题: Qt和Boost做跨平台的线程封装,OpenMP主要做并行计算,让不精通多线程的人也能高效地利用CPU的计算能力.个人倾向于用boost.thread, boost.mpi.   一 ...

  5. qt线程(转)----这篇很专业!

    本文档是自己所整理的一份文档,部分是原创,还转贴了网上的一此资料(已经标明了),(难点是多线程的编写),是有源代码的,大家可以作为参考,用到的知识是视频采集,压缩解压(xvid),实时传输(jrtp) ...

  6. QT核心编程之Qt线程 (c)

    QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类 ...

  7. Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)

    Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...

  8. Qt 线程基础(QThread、QtConcurrent等)

    [-] 使用线程 何时使用其他技术替代线程 应该使用 Qt 线程的哪种技术 Qt线程基础 QObject与线程 使用互斥量保护数据的完整 使用事件循环防止数据破坏 处理异步执行 昨晚看Qt的Manua ...

  9. Qt 线程基础

    (转自:http://my.oschina.net/laopiao/blog/88158) 何谓线程? 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据 ...

随机推荐

  1. asp.net运行原理及机制

    当一个HTTP请求到服务器并被IIS接收到之后,IIS首先通过客户端请求的页面类型为其加载相应的.dll文件,然后在处理过程中将这条请求发送给能够处理这个请求的模块.在ASP.NET 3.5中,这个模 ...

  2. node.js使用swig模块

    1.安装swig npm install swig --save 2.创建app.js文件 /*应用程序入口文件*/ /*加载express模块*/ var express = require('ex ...

  3. vim最常用命令

    vi/vim常用命令汇总 vi/vim概述 vi/vim是Linux和Unix下的一款非常强大的编辑器,vim是vi的增强 版,命令更加多种和复杂,但是最常用的也就是那几个. vi有三种模式 命令行模 ...

  4. drop与truncate与delete的区别与联系

    在mysql和oracle数据库中delete与truncate都是可以用来对数据进行删除操作,但是二者又有些不同. 主要有以下几个区别: 区别一: 根据sql语言分类来说,delete属于DML语言 ...

  5. {经典}springmvc+mybatis+restful+webservice Jeesz分布式架构

    框架简介--主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件组件.代码生成等.采用 ...

  6. Git命令之:git push

    保护版权:转自,http://www.yiibai.com/git/git_push.html

  7. python字符串/列表/字典互相转换

    python字符串/列表/字典互相转换 目录 字符串与列表 字符串与字典 列表与字典 字符串与列表 字符串转列表 1.整体转换 str1 = 'hello world' print(str1.spli ...

  8. 一、core 启动设置文件中的错误(启动文件不存在)

    一.启动文件不存在 查看 别人的 原因是

  9. 查个远程桌面是否开启 debug版360报毒 release 不报毒

    360 真tm流氓一个

  10. 深入理解JAVA虚拟机 高效并发

    处理器和缓存 由于计算机的存储设备与处理器的运算速度之间有着几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理之间的缓冲:将运算需要使用的数 ...