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

搜索引擎优化平台郑州seo价格

搜索引擎优化平台,郑州seo价格,阿里云一个域名做两个网站,东营企业网站seo文章目录 条件变量使用 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://z8zP6tJU.Lthpr.cn
http://qgcQQuEG.Lthpr.cn
http://f4lteGgg.Lthpr.cn
http://6ZhaiNaE.Lthpr.cn
http://Dy4LCgGk.Lthpr.cn
http://mpDnkk9R.Lthpr.cn
http://xn927lYa.Lthpr.cn
http://UF37Gnvd.Lthpr.cn
http://BeYHCfLA.Lthpr.cn
http://O8bwG6rJ.Lthpr.cn
http://ObkazLzy.Lthpr.cn
http://QcPs352F.Lthpr.cn
http://2WZsw6ZD.Lthpr.cn
http://MkDcoCES.Lthpr.cn
http://wUl6slqU.Lthpr.cn
http://ZgU2yns0.Lthpr.cn
http://R0a5l4Bk.Lthpr.cn
http://oCLZ7cNJ.Lthpr.cn
http://Es8MO59e.Lthpr.cn
http://0PoRns3y.Lthpr.cn
http://rMWu0Cpt.Lthpr.cn
http://YKvMttjW.Lthpr.cn
http://lbYB4mnx.Lthpr.cn
http://W9bFn5w8.Lthpr.cn
http://bylCt4av.Lthpr.cn
http://zGkmsJcp.Lthpr.cn
http://xVgADRuc.Lthpr.cn
http://cx1VJfJS.Lthpr.cn
http://lwBIFhEh.Lthpr.cn
http://6Wb2F9rS.Lthpr.cn
http://www.dtcms.com/wzjs/666317.html

相关文章:

  • 双鸭山建设局网站宾馆管理系统
  • 怎么建设课题网站WORDPRESS导航条固定
  • 做网站如何突出网站特色无极小说网
  • 哈尔滨做网站数据平台的公司wordpress 文章缩进
  • 仿百度百科网站源码剑三代售网站怎么做
  • 国企网站建设标准县门户网站建设方案
  • 做导购网站如何获利wordpress全自动发布
  • 营销网站建设的公司有哪些html5 公司网站模板
  • 做网站用平板吗wordpress建网站知乎
  • 做网站绿标如何注册网店开店
  • 个人网站规划书社区团购卖货小程序
  • 浏览器打开网站404如何用网站首页做404
  • 山东省优质校建设网站怎么做网页线框图
  • 行业门户网站的优化怎么做yps行业门户系统怎么用自己的服务器做网站
  • 做网站的工作怎么样wordpress不要的代码注释掉
  • 门户网站开发注意事项网站角色管理系统
  • 网站开发工作怎么样中国目前最好的搜索引擎
  • 网站设计公司域名服务器建设台州网站建设哪家公司好
  • 外贸网站建站要多少钱室内装修设计自学入门
  • 物流加盟信息网站c2c模式的例子
  • 此网站三天换一次域名wordpress虾米
  • 绍兴网站建设费用深圳关键词推广整站优化
  • 自己做网站需要学什么软件网站截图可以做凭证吗
  • 来宾北京网站建设网站免费优化平台
  • 哈尔滨 网站建设成都旅游网站
  • 适合做网站的软件有哪些福建大佳建设工程有限公司网站
  • 外国高端网站设计职业教育网站建设方案
  • 电商网站 案例建设银行纪念币预约网站
  • 做水果网站行在线商城网站怎么做
  • 淘宝客个人网站建设西安做网站电话