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

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)按钮点击一次时的调试输出

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

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

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

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

05-11 20:42