同步QT中两种方法的螺纹执行

Sync the threaded execution of two methods in Qt

本文关键字:执行 方法 QT 两种 同步      更新时间:2023-10-16

使用qt,我有两个 Worker类的实例(继承了 QObject(,每个实例都使用 moveToThread

Worker类具有我从主线程调用的performOperation方法:

QMetaObject::invokeMethod(workerLeft, "performOperation");

使其在工人的线程中运行。很好,但是我想在我的两个 Worker实例上并行运行 performOperation,然后在主线程中等待两者完成。类似于并联BlockingQueuedConnection

我尝试使用QtConcurrent::runQFutureSynchronizer尝试了另一种策略:

QFuture<QString> runLeft = QtConcurrent::run(workerLeft, &Worker::performOperation);
QFuture<QString> runRight = QtConcurrent::run(workerRight, &Worker::performOperation);
QFutureSynchronizer<QString> sync;
sync.addFuture(runLeft);
sync.addFuture(runRight);
sync.waitForFinished();

但是它不起作用,因为我在performOperation中使用的Worker中使用了QTcpSocket,并且与以下方式失败:

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

我能够通过在performOperation方法中创建QTcpSocket来使其起作用,但是我不喜欢那样,每次创建套接字非常昂贵。

我认为,如果我可以选择QtConcurrent::run应该运行哪个线程,但是我还没有找到任何类似的选项。

我认为有一个混乱:1/如果您使用QTConcurrent,则基本上让QT管理与多线程相关的所有内容。在这种情况下,您不会在任何时候手动创建一个工人线程,您都不将对象移至此工人,请参阅文档:http://doc.qt.io/qt-5/qtconcurrentrun.html

合同仅仅是传递将在背景线程中执行的(坚固的(函数。这是一个高级并行编程API。

2/如果您实现了生活在工作线程中的工作对象,并且要同步,则必须使用其他方法,例如信号/插槽或qmutex。这是一个较低级的线程API,并不是要与并发和未来的API结合使用。