当前位置: 首页 > wzjs >正文

新吁网站建设国内知名的app开发

新吁网站建设,国内知名的app开发,宁波网络建站模板,企业创新平台建设文章目录 条件变量使用 wakeOne()使用 wakeAll() 条件变量 QT的条件变量类是QWaitCondition,有wakeOne() 和 wakeAll() 两个方法 wakeOne():仅唤醒一个等待的线程。wakeAll():唤醒所有等待的线程。 使用 wakeOne() https://github.com/Bi…

文章目录

  • 条件变量
    • 使用 wakeOne()
    • 使用 wakeAll()

条件变量

QT的条件变量类是QWaitCondition,有wakeOne()wakeAll() 两个方法

  • wakeOne():仅唤醒一个等待的线程。
  • wakeAll():唤醒所有等待的线程。

使用 wakeOne()

https://github.com/BinaryAI-1024/QtStudy/tree/master/thread/conditionVariable

有 3 个工作线程 在 QWaitCondition 上等待,wakeOne() 只唤醒其中一个线程。

// main.cpp
#include <QCoreApplication>
#include <QThread>
#include <QTimer>
#include "myworker.h"int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);const int numThreads = 3;QThread* threads[numThreads];MyWorker* workers[numThreads];for (int i = 0; i < numThreads; ++i) {threads[i] = new QThread();workers[i] = new MyWorker();workers[i]->moveToThread(threads[i]);// 线程启动时,工作对象执行 doWork()QObject::connect(threads[i], &QThread::started, workers[i], &MyWorker::doWork);// 任务完成后退出线程的事件循环QObject::connect(workers[i], &MyWorker::finished, threads[i], &QThread::quit);// 任务完成后删除工作对象QObject::connect(workers[i], &MyWorker::finished, workers[i], &QObject::deleteLater);// 线程退出后删除线程对象QObject::connect(threads[i], &QThread::finished, threads[i], &QObject::deleteLater);threads[i]->start();}// 2 秒后唤醒所有线程QTimer::singleShot(2000, [=]() {workers[0]->startWork();  // 让所有 worker 线程醒来});return app.exec();
}
// myworker.h
#ifndef MYWORKER_H
#define MYWORKER_H#include <QObject>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QDebug>class MyWorker : public QObject {Q_OBJECT
public:explicit MyWorker(QObject *parent = nullptr);~MyWorker();
signals:void finished();
public slots:void doWork();void startWork();private:QMutex mutex;              // 每个实例都有一个互斥锁QWaitCondition condition;  // 每个实例都有一个条件变量bool ready = false;        // 每个实例都有一个标志变量
};#endif // MYWORKER_H
// myworker.cpp
#include "myworker.h"MyWorker::MyWorker(QObject *parent) : QObject(parent) {}MyWorker::~MyWorker() {qDebug() << QThread::currentThread() << "Worker destroyed";
}void MyWorker::doWork() {qDebug() << QThread::currentThread() << "Worker waiting...";{QMutexLocker locker(&mutex);  // 加锁while (!ready) {  // 等待被唤醒condition.wait(&mutex);}}qDebug() << QThread::currentThread() << "Worker processing...";QThread::msleep(2000);qDebug() << QThread::currentThread() << "Worker finished!";emit finished();
}void MyWorker::startWork() {QMutexLocker locker(&mutex);ready = true;condition.wakeOne();  // 仅唤醒一个线程
}

运行结果

QThread(0x1481b00) Worker waiting...
QThread(0x1487b10) Worker waiting...
QThread(0x1487d58) Worker waiting...
QThread(0x1481b00) Worker processing...
QThread(0x1481b00) Worker finished!
QThread(0x1481b00) Worker destroyed

使用 wakeAll()

https://github.com/BinaryAI-1024/QtStudy/tree/master/thread/conditionVariableAll
有 3 个工作线程在 QWaitCondition 上等待,wakeAll() 同时唤醒所有线程。这需要将QMutexQWaitConditionready 声明为静态变量,在多个 MyWorker实例间共享。

// main.cpp
#include <QCoreApplication>
#include <QThread>
#include <QTimer>
#include "myworker.h"int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);const int numThreads = 3;QThread* threads[numThreads];MyWorker* workers[numThreads];for (int i = 0; i < numThreads; ++i) {threads[i] = new QThread();workers[i] = new MyWorker();workers[i]->moveToThread(threads[i]);// 线程启动时,工作对象执行 doWork()QObject::connect(threads[i], &QThread::started, workers[i], &MyWorker::doWork);// 任务完成后退出线程的事件循环QObject::connect(workers[i], &MyWorker::finished, threads[i], &QThread::quit);// 任务完成后删除工作对象QObject::connect(workers[i], &MyWorker::finished, workers[i], &QObject::deleteLater);// 线程退出后删除线程对象QObject::connect(threads[i], &QThread::finished, threads[i], &QObject::deleteLater);threads[i]->start();}// 2 秒后唤醒所有线程QTimer::singleShot(2000, [=]() {workers[0]->startWork();  // 让所有 worker 线程醒来});return app.exec();
}
// myworker.h
#ifndef MYWORKER_H
#define MYWORKER_H#include <QObject>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QDebug>class MyWorker : public QObject {Q_OBJECT
public:explicit MyWorker(QObject *parent = nullptr);~MyWorker();
signals:void finished();
public slots:void doWork();void startWork();private:static QMutex mutex;  // 互斥锁(多个 MyWorker 共享)static QWaitCondition condition;  // 等待条件(多个 MyWorker 共享)static bool ready;  // 共享的标志变量
};#endif // MYWORKER_H
// myworker.cpp
#include "myworker.h"
#include <QMutexLocker>
// 共享变量初始化
QMutex MyWorker::mutex;
QWaitCondition MyWorker::condition;
bool MyWorker::ready = false;MyWorker::MyWorker(QObject *parent) : QObject(parent) {}MyWorker::~MyWorker() {qDebug() << QThread::currentThread() << "Worker destroyed";
}void MyWorker::doWork() {qDebug() << QThread::currentThread() << "Worker waiting...";{QMutexLocker locker(&mutex);  // 加锁while (!ready) {  // 等待被唤醒condition.wait(&mutex);}}qDebug() << QThread::currentThread() << "Worker processing...";QThread::msleep(2000);qDebug() << QThread::currentThread() << "Worker finished!";emit finished();
}void MyWorker::startWork() {QMutexLocker locker(&mutex);ready = true;condition.wakeAll();  // 唤醒所有等待的线程
}

运行结果

QThread(0xa9f1b00) Worker waiting...
QThread(0xa9f7fd8) Worker waiting...
QThread(0xa9f80d0) Worker waiting...
QThread(0xa9f1b00) Worker processing...
QThread(0xa9f80d0) Worker processing...
QThread(0xa9f7fd8) Worker processing...
QThread(0xa9f1b00) Worker finished!
QThread(0xa9f80d0) Worker finished!
QThread(0xa9f7fd8) Worker finished!
QThread(0xa9f1b00) Worker destroyed
QThread(0xa9f7fd8) Worker destroyed
QThread(0xa9f80d0) Worker destroyed

文章转载自:

http://wreQJvd0.nspbj.cn
http://GpCJbhZm.nspbj.cn
http://HhgK1IqL.nspbj.cn
http://JZ43spwO.nspbj.cn
http://iCb47zm7.nspbj.cn
http://PlemKDbc.nspbj.cn
http://oA9wtkoU.nspbj.cn
http://EKK6UMMe.nspbj.cn
http://MfSJ1ANo.nspbj.cn
http://Ma51HrFc.nspbj.cn
http://BNpOg4jD.nspbj.cn
http://QNdgrEke.nspbj.cn
http://xnL64eZR.nspbj.cn
http://JKdNe0d7.nspbj.cn
http://T9VtyYGw.nspbj.cn
http://wjNoA9f7.nspbj.cn
http://mcRukU9u.nspbj.cn
http://YU388kcU.nspbj.cn
http://bANqqB3b.nspbj.cn
http://ZoVV0uqB.nspbj.cn
http://kV1LaI7X.nspbj.cn
http://nDKbBuOr.nspbj.cn
http://y4tOUjFR.nspbj.cn
http://N8jqONpz.nspbj.cn
http://vNrFZg6D.nspbj.cn
http://JygwIA6k.nspbj.cn
http://VKmId6bq.nspbj.cn
http://zsEns0lv.nspbj.cn
http://CQsoONqN.nspbj.cn
http://41VAwMuf.nspbj.cn
http://www.dtcms.com/wzjs/650691.html

相关文章:

  • 手机网站设计尺寸大小餐饮公司企业网站源码
  • 原画师平台关键词排名优化
  • 九江建设监督网站服装设计方案
  • 易语言怎么做ifa网站填表seo公司赚钱吗
  • wordpress注册页插件南宁网站seo公司
  • 网站建设最高管理权限android 解析 wordpress
  • 教人做美食的网站网站详情怎么做的
  • 建筑网站知乎网站的后台地址
  • 网站建设预付款云阳做网站
  • 大厂县网站建设或SEO优化做刷单哪个网站找小白
  • 帝国cms网站名称免费的wordpress模板下载地址
  • 做公司网站都需要付什么费用网上智慧团建网站
  • 网页制作制作网站wordpress产品系统
  • 百度做网站为什么上阿里云备案wordpress首页全屏插件
  • 如何建立简单网站广州定制网站建设方案书
  • 济宁市建设局网站wordpress admin-ajax.php
  • 手机cms建站系统购物网站前台功能模块分析
  • 做网站怎样租用虚拟空间设计平台什么意思
  • 做网站优化的教程网络建设与运维技能大赛中职组
  • 广西seo网站推广wordpress附件分离
  • 高校网站建设管理办法手机网站的模板下载软件
  • 十大免费游戏网站点开即玩wordpress优化记录
  • 自己做一个模版网站是怎么做的单页网站上传教程
  • 阿里云个人网站备案过程全记录建酒店网站
  • 青岛响应式网站免费软件如何盈利
  • 慈溪网站制作百度搜图匹配相似图片
  • 网站设计中怎么设置当前元素不可见windows系统没有wordpress
  • seo网站建设规划三亚发布紧急通知
  • 温州论坛网站首页互联网公司设计师都设计什么
  • 关于公司网站建设请示楚雄做网站建设的公司