在不同的无限循环(QTimerEvent)上同步Qthreads
Sync Qthreads on different infinite loops (QTimerEvent)
考虑一个Qt项目。我定义了不同的 Qthreads 来在每个类的 timerEvent 中进行计算,并在 QMainWindow 上显示结果。(A类,B类和C类相同,只是printf()
的内容会改变!
这是a.h
class A : public QObject
{
Q_OBJECT
public:
explicit A(QObject *parent = 0);
void timerEvent(QTimerEvent *);
private:
int timerId;
};
A.cpp
是:
A::A(QObject *parent) :
QObject(parent)
{
timerId = startTimer(1000);
}
void A::timerEvent(QTimerEvent *)
{
printf("An");
}
main.cpp
如下:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QThread thread_1, thread_2, thread_3;
A objA;
B objB;
C objC;
objA.moveToThread(&thread_1);
objB.moveToThread(&thread_2);
objC.moveToThread(&thread_3);
thread_1.start();
thread_2.start();
thread_3.start();
return a.exec();
}
请注意,我无法更改课程的布局。问题是在这些情况下如何同步我的 Qthreads?每个类的结果都没有依赖关系,但我必须确保所有结果每秒都以相同的顺序可用。例如,结果必须始终显示为 A B C A B C A B C ...谢谢!
你问的是不可能的。在线程中运行的代码的执行时间会有所不同,因为内核与OS
其余部分共享,并且会有所不同以及它们处于活动状态的时间。足以使订单可能会更改,您可以保证。 大多数并发系统对这一点使用线性段,例如并行处理所有任务,将结果放入队列中,当并行部分完成后,对其进行排序(如 by 和 id),然后进行处理。
您可以在QtConcurrent
中尝试MapReduce
。或者尝试任务依赖关系,但这实质上是告诉系统在B
后运行C
,并在A
后B
,使其按顺序运行。您需要考虑所需的排序约束。
如果你不能改变类 A、B 和 C,你仍然可以创建一个管理类,该类被移动到它的线程中,拥有 A、B 和 C 对象,有一个事件计时器,并在超时时以正确的顺序调用timerEvent()
函数。
这更有意义,因为结果应该是有序的。
但是,如果这是线程同步的练习,则应将这些类包装在可以执行某种同步的类中,例如条件变量,让下一个类知道当前类已完成。
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 如何在qt中同步应用程序和显示器的刷新率?
- Windows 进程间同步类似事件?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- ofstream::close() 是否在 Linux 上调用同步?
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 原子获取是否与互斥锁释放同步?
- Boost (Beast) websocket:同步写入挂起
- Postgres vs MySQL:命令不同步;.
- QObjects 被移动到 QThreads 后信号不再工作
- 线程过程中的线程同步问题
- 同步读取多个 TCP 响应
- 同步两个具有不同帧速率的传感器
- 如何定期同步线程?
- 同步对多个向量进行排序
- 在不同的无限循环(QTimerEvent)上同步Qthreads