Сбой при отображении окна PyQt4 после импорта расширения Python, использующего OpenMP - PullRequest
1 голос
/ 01 сентября 2011

Я занимаюсь разработкой приложения на Python, использующего модуль C-extension, который я также разработал сам. Модуль расширения выполняет некоторые сложные вычисления и использует OpenMP. Недавно я добавил некоторые компоненты GUI в свое приложение Python, используя PyQt4. Однако, когда я показываю окно, приложение вылетает до того, как окно полностью прорисовано (окно появляется очень скоро). Мне удалось отследить проблему: когда я компилирую свое C-расширение, не поддерживающее OpenMP, окно отображается нормально, и все работает. Я предполагаю, что это как-то связано с потоками между OpenMP и Qt. Кто-нибудь когда-либо делал подобное наблюдение?

Ответы [ 3 ]

1 голос
/ 18 сентября 2011

Это может быть в том случае, если что-то в PyQT является небезопасным потоком.

Может быть, вы могли бы попытаться использовать zeromq с inproc или ipc , например.

1 голос
/ 19 сентября 2011
  1. Убедитесь, что в расширении расширения OpenMP отсутствуют условия гонки.
  2. Избегайте обновления окон или любых других операций графического интерфейса из нескольких потоков - используйте #pragma omp single или #pragma omp master для такого рода вещей.
  3. Если у вас есть переменная / обратный вызов для кода Python, убедитесь, что все потоки завершили то, что должны были сделать, прежде чем изменять переменную или делать обратный вызов.

Потоки из QT и из OpenMP - совершенно разные потоки, поэтому с этим проблем не должно возникнуть.

1 голос
/ 16 сентября 2011

В качестве обходного пути вы можете создать отдельную программу, используя openmp и программу внешнего интерфейса Qt. и заставить их общаться, используя сокет tcp или что-то знакомое (dll - другой вариант?).

смысл в том, чтобы изолировать разные модули, если один модуль выходит из строя, вы знаете, какая часть выходит из строя. как одна большая большая программа, трудно найти один дикий указатель ...

...