QEventLoop

介绍

  1. 提供了一种异步编程的方式。
  2. 本地创建的QEventLoop并不会影响主Application的逻辑。
  3. 比while等待效率高。

使用

#include <QCoreApplication>
#include <QEventLoop>
#include <QObject>
#include <iostream>

QEventLoop loop;
int a = 3;

// 线程A
void funcA() {
    // do something
    loop.exec(); // 进入事件循环
    std::cout << a << std::endl; // a == 4
}

// 线程B
class MyObject : public QObject {
    Q_OBJECT

public slots:
    void slotAdd() {
        ++a;
        loop.exit(); // 退出事件循环
    }
};

void signalAdd();

int main(int argc, char* argv[]) {
    QCoreApplication app(argc, argv);

    MyObject objB;
    QObject::connect(&app, SIGNAL(signalAdd()), &objB, SLOT(slotAdd()));

    // 启动线程A
    QThread threadA;
    threadA.start();
    QMetaObject::invokeMethod(&threadA, "funcA", Qt::QueuedConnection);

    // 启动线程B
    QThread threadB;
    threadB.start();
    QMetaObject::invokeMethod(&threadB, "signalAdd", Qt::QueuedConnection);

    return app.exec();
}

posted @ 2022-10-08 16:45  flxx  阅读(121)  评论(0编辑  收藏  举报