2012-09-24 22 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

@科裏恩,是的。這就是我正在做的並且工作正常。 –