2012-09-24 23 views
2

我们的软件由C++/Qt中的图形用户界面组成。用户界面在一个使用C++/OpenMP进行并行化的单独库中控制几个繁重的计算算法。在这个库中我们不能使用Qt。如何将响应式Qt GUI与基于OpenMP的计算库结合起来?

为了保持我们的GUI响应,我们使用函数指针调用QApplication::processEvents();。这当然会导致意大利面代码。我们希望将GUI与计算库分开,以便函数调用不再阻止GUI。什么是干净和最好的方式来做到这一点?

+0

以“让我们的GUI有求必应”,你的意思是能够中断任何运行OpenMP代码? – Walter

+1

我希望当其他库中的openMP代码运行时,Qt事件循环不会被阻塞。在这种情况下,GUI将会有响应。 –

回答

0

如果你不需要中断openMP库调用,那么我会选择一种简单的多线程方法:一个线程处理GUI,另一个与计算库。当然,你不能使用openMP(这对于计算openMP库来说并不好),但是必须使用其他的多线程方法。现在C++ 11自带了对线程的直接支持,所以这就是我会做的。

编辑:读安东尼·威廉斯“的动作C++并发”

+0

为什么不能这样工作?我无法从Qt主线程启动一个新线程,并让它使用OpenMP进行计算?请注意:在此期间我没有阅读过这本书。尽管如此,感谢指针。 –

+0

应该工作(谁说它不会?)你不能使用openMP来拆分工作,因为当前所有的实现并不真正做嵌套的并行区域。 – Walter

+0

好吧,对不起,我误解了'这不会很好'的一部分。 –

0

QApplication启动控制循环,该循环调用GUI方法。自然,任何长时间的方法都会阻止队列。为了防止这种情况,您需要通过fork/QThread产生额外的进程/线程。我认为QThread的方法将是最简单的方法来实现你的目标

+0

所以你的意思是以下?我应该从Qt GUI开始一个线程工作者。工作人员能够在不阻止GUI的情况下开始计算。然后我的GUI调用通过工作人员发送。 GUI和工作人员之间的通信应该通过信号 - >插槽连接完成。 –

+1

@科里恩,是的。这就是我正在做的并且工作正常。 –