一个Qt线程的例子,用于说明QWaitCondition的作用

本文通过具体的代码示例,展示了如何在Qt环境下实现主线程与两个子线程间的交互。重点介绍了QThread、QWaitCondition及QMutex的使用方法,以实现线程间的同步与唤醒。

 

 

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

main.cpp

 

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

mainpage.h

 

 

[cpp]  view plain copy
 
  1. #ifndef MAINPAGE_H  
  2. #define MAINPAGE_H  
  3.   
  4. #include <QWidget>  
  5.   
  6. #include "thread1.h"  
  7.   
  8.   
  9. class MainPage : public QWidget  
  10. {  
  11.     Q_OBJECT  
  12.   
  13. public:  
  14.     explicit MainPage(QWidget *parent = 0);  
  15.     ~MainPage();  
  16.   
  17.     thread1 *th1;  
  18.   
  19. private slots:  
  20.     void doClick();  
  21.   
  22. };  
  23.   
  24. #endif // MAINPAGE_H  

thread1.h

 

 

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

thread2.h

 

 

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

mainpage.cpp

 

 

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

thread1.cpp

 

 

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

thread2.cpp

 

 

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

运行效果:

 

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

 

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

 

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

转载于:https://www.cnblogs.com/lvdongjie/p/7787829.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值