【发布时间】:2015-04-26 06:15:10
【问题描述】:
以下成员函数在主事件循环中运行。
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 ... 并行进行。 我怎样才能做到这一点?
【问题讨论】:
-
你的意思是当
... updates ...还在忙的时候结果就准备好了? -
不!但是计算已经可以并行开始,不需要完成。上面更新使其更明显
-
如果 doCalculations 没有被触发,那么我的猜测是它不是在不同的线程中。你正确地调用 moveToThread 了吗?
-
是的,在我通过 QASSERT 检查的实际代码中,它正确地具有不同线程的亲和性。我的问题是如何最好地触发第二个线程。我知道信号/插槽是一种方式,但信号只会在更新完成后由主事件循环处理。
-
显示更多代码!如果您将
m_interpolator正确移动到其他线程(无父线程),则不应直接从主线程调用其方法。您应该使用将进行线程间通信的槽信号机制。使用信号为m_interpolator安排工作,并使用信号报告这项工作的进度。