同步QT中两种方法的螺纹执行
Sync the threaded execution of two methods in Qt
使用qt,我有两个 Worker
类的实例(继承了 QObject
(,每个实例都使用 moveToThread
。
Worker
类具有我从主线程调用的performOperation
方法:
QMetaObject::invokeMethod(workerLeft, "performOperation");
使其在工人的线程中运行。很好,但是我想在我的两个 Worker
实例上并行运行 performOperation
,然后在主线程中等待两者完成。类似于并联BlockingQueuedConnection
。
我尝试使用QtConcurrent::run
和QFutureSynchronizer
尝试了另一种策略:
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结合使用。
相关文章:
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 如何使父类不重复已经执行的祖父方法
- 如何将带有参数的方法传递给线程以执行?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 在 c++ 中从执行的 shell 命令获取返回状态的安全方法是什么?
- 在高通六边形处理器的word32上执行水平求和的最快方法是什么
- 在C++中执行方法的同一行中传递指针
- 在 MySQL 连接器C++ API 中使用一个函数调用执行多个查询的正确方法是什么?
- 如何执行重写的方法C++
- 基于整数向量执行位排列的有效方法?
- 执行模板参数包指向的所有方法
- cppUnit:针对多个测试方法执行一次的设置函数
- C++对象的 WMI 执行方法
- 为什么在从线程执行方法时使用QMetaObject::invokeMethod
- 执行方法调用时,有什么理由不C++中添加嵌套类/结构解析
- 有没有办法让C++类在开始执行析构函数之前自动执行方法
- 分段错误执行方法
- 只要发现字符,C++就会搜索并执行方法