Наше программное обеспечение состоит из графического интерфейса пользователя на C ++ / Qt. Пользовательский интерфейс управляет несколькими сложными вычислительными алгоритмами в отдельной библиотеке, которая использует C ++ / OpenMP для распараллеливания. В этой библиотеке мы не можем использовать Qt.
Чтобы обеспечить поддержку нашего графического интерфейса, мы используем указатели функций, которые вызывают QApplication::processEvents();
, Это, конечно, приводит к коду спагетти. Мы хотели бы отделить графический интерфейс от библиотеки вычислений, чтобы вызовы функций больше не блокировали графический интерфейс. Какой чистый и предпочтительный способ сделать это?
Если вам не нужно прерывать вызовы библиотеки openMP, я бы выбрал простой многопоточный подход: один поток имеет дело с GUI, другой — с вычислительной библиотекой. Естественно, вы не можете использовать openMP для этого (это не очень хорошо с вычислительной библиотекой openMP), но вы должны использовать другие многопоточные методы. C ++ 11 теперь поставляется с собственной прямой поддержкой потоков, поэтому я бы так и сделал.
РЕДАКТИРОВАТЬ: прочитать Энтони Уильямс «C ++ параллелизм в действии»
QApplication
запускает цикл управления, который вызывает методы GUI. Естественно, любой метод, который займет много времени, заблокирует очередь. Чтобы предотвратить это, вам нужно создать дополнительный процесс / поток через fork
/QThread
, я думаю QThread
подход будет самым чистым способом достичь своей цели