我們的軟件由C++/Qt中的圖形用戶界面組成。用戶界面在一個使用C++/OpenMP進行並行化的單獨庫中控制幾個繁重的計算算法。在這個庫中我們不能使用Qt。如何將響應式Qt GUI與基於OpenMP的計算庫結合起來?
爲了保持我們的GUI響應,我們使用函數指針調用QApplication::processEvents();
。這當然會導致意大利麪代碼。我們希望將GUI與計算庫分開,以便函數調用不再阻止GUI。什麼是乾淨和最好的方式來做到這一點?
我們的軟件由C++/Qt中的圖形用戶界面組成。用戶界面在一個使用C++/OpenMP進行並行化的單獨庫中控制幾個繁重的計算算法。在這個庫中我們不能使用Qt。如何將響應式Qt GUI與基於OpenMP的計算庫結合起來?
爲了保持我們的GUI響應,我們使用函數指針調用QApplication::processEvents();
。這當然會導致意大利麪代碼。我們希望將GUI與計算庫分開,以便函數調用不再阻止GUI。什麼是乾淨和最好的方式來做到這一點?
如果你不需要中斷openMP庫調用,那麼我會選擇一種簡單的多線程方法:一個線程處理GUI,另一個與計算庫。當然,你不能使用openMP(這對於計算openMP庫來說並不好),但是必須使用其他的多線程方法。現在C++ 11自帶了對線程的直接支持,所以這就是我會做的。
編輯:讀安東尼·威廉斯「的動作C++併發」
爲什麼不能這樣工作?我無法從Qt主線程啓動一個新線程,並讓它使用OpenMP進行計算?請注意:在此期間我沒有閱讀過這本書。儘管如此,感謝指針。 –
應該工作(誰說它不會?)你不能使用openMP來拆分工作,因爲當前所有的實現並不真正做嵌套的並行區域。 – Walter
好吧,對不起,我誤解了'這不會很好'的一部分。 –
QApplication
啓動控制循環,該循環調用GUI方法。自然,任何長時間的方法都會阻止隊列。爲了防止這種情況,您需要通過fork
/QThread
產生額外的進程/線程。我認爲QThread
的方法將是最簡單的方法來實現你的目標
所以你的意思是以下?我應該從Qt GUI開始一個線程工作者。工作人員能夠在不阻止GUI的情況下開始計算。然後我的GUI調用通過工作人員發送。 GUI和工作人員之間的通信應該通過信號 - >插槽連接完成。 –
@科裏恩,是的。這就是我正在做的並且工作正常。 –
以「讓我們的GUI有求必應」,你的意思是能夠中斷任何運行OpenMP代碼? – Walter
我希望當其他庫中的openMP代碼運行時,Qt事件循環不會被阻塞。在這種情況下,GUI將會有響應。 –