Qt:立即启动线程,没有主事件循环的延迟

时间:2015-02-24 14:52:29

标签: c++ qt qthread

以下成员函数在主事件循环中运行。

    void MyClass::update()
    {
        Data x = m_interpolator->getRequest(m_interpolationRequest)
        // non blocking new calclulation request
        m_interpolator->asyncRequestCalculations(++m_interpolationRequest);
        // I want to run doCalculations from now on in a second thread
        ... updates ... // takes some time
    }
    <-- earliest time when doCalculations() will be triggered

每次调用update我都会请求一个新的计算,我会在下一个周期中获取。

CInterpolator (m_interpolator)是另一个帖子中的QObject(使用moveToThread)。 asyncRequestCalculations调用(非阻止)CInterpolator::doCalculations的呼叫(与向doCalculations广告位发送信号相同)。

它有效,但速度太慢。发生的情况是doCalculations的信号已正确安排,但CInterpolator仅在功能update之后被称为。可以理解,这就是Qt事件循环的工作原理。

但对我来说,这会浪费... updates ...块的时间。我希望计算与... updates ...并行进行。 我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

主要事件循环应该是快速操作,应该连续执行。因此,这就是为什么你观察到应用程序太慢的原因:刷新率比它应该慢。

建议不要在更新/事件循环中使用慢速操作。

顺便说一下,为了进行并行执行,你必须使用threads。 一个代码代码段应为:

void MyClass::update()
    {
        Data x = m_interpolator->getRequest(m_interpolationRequest)
        // non blocking new calclulation request
        m_interpolator->asyncRequestCalculations(++m_interpolationRequest);
        // I want to run doCalculations from now on in a second thread

       std::thread first(update());
    }