【问题标题】:Sync Qthreads on different infinite loops (QTimerEvent)在不同的无限循环上同步 Qthreads (QTimerEvent)
【发布时间】:2016-06-02 08:35:05
【问题描述】:

考虑一个 Qt 项目。我已经定义了不同的 Qthread 来在每个类的 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("A\n");
}

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 ...谢谢!

【问题讨论】:

  • 如果要顺序处理,真的需要使用单独的线程吗?
  • “我想做点别的事情,但我不能改变我的代码”有了这种态度,你几乎可以放弃:(
  • @KubaOber 有些人会帮忙,但像你这样的人只会抱怨!我无法理解你的回答。

标签: c++ multithreading qt infinite-loop qthread


【解决方案1】:

你问的是不可能的。线程中运行的代码的执行时间会有所不同,因为核心与OS 的其余部分共享,并且会有所不同以及它们的活动时间。足以让订单发生变化,您可以保证。 大多数并发系统在这一点上使用线性段,例如并行处理所有任务,将结果放入队列中,当并行部分完成时,对其进行排序(如按和 id)然后处理。

您可以在QtConcurrent 中尝试MapReduce。或者尝试任务依赖,但这实际上会告诉系统在B 之后运行C,在A 之后运行B,使其连续运行。你需要考虑你想要什么排序约束。

【讨论】:

    【解决方案2】:

    如果您无法更改 A、B 和 C 类,您仍然可以创建一个管理类,该类被移动到其线程,拥有 A、B 和 C 对象,具有事件计时器并在超时时调用 @ 987654321@ 按正确顺序运行。

    这更有意义,因为结果应该是有序的。

    但是,如果这是关于线程同步的练习,您应该将这些类包装在可以进行某种同步的类中,例如让下一个类知道当前类已完成的条件变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多