1

私も自分で開発したC拡張モジュールを使用するpythonアプリケーションを開発しています。拡張モジュールは、いくつかの重い計算処理を行い、OpenMP を利用します。最近、PyQt4 を使用して、いくつかの GUI コンポーネントを Python アプリケーションに追加していました。ただし、ウィンドウを表示すると、ウィンドウが完全に描画される前にアプリケーションがクラッシュします (ウィンドウはすぐに表示されます)。私は問題を追跡することができました: OpenMP サポートなしで数値処理を行う C 拡張をコンパイルすると、ウィンドウは正常に表示され、すべてが機能します。OpenMP と Qt の間のスレッド処理に関係があると思います。誰かが同じような観察をしたことがありますか?

4

3 に答える 3

1

PyQTの何かがスレッドセーフでない場合があります。

たとえば、 inprocまたはipcでzeromqを使用してみることができます。

于 2011-09-18T08:07:48.883 に答える
1

回避策として、openmp を使用してスタンドアロン プログラムと Qt フロントエンド プログラムを作成できます。TCPソケットまたはおなじみのものを使用して通信させます(dllは別のオプションですか?)。

ポイントは、異なるモジュールを分離することです。1 つのモジュールが失敗した場合、どの部分が失敗したかがわかります。1 つの大きなプログラム全体として、1 つのワイルド ポインターを見つけるのは困難です...

于 2011-09-16T07:58:18.710 に答える
1
  1. OpenMP 数値計算拡張機能に競合状態がないことを確認してください。
  2. 複数のスレッドからウィンドウやその他の GUI 操作を更新することは避けてください。この種のものには#pragma omp singleorを使用してください。#pragma omp master
  3. Python コードへの変数/コールバックがある場合は、変数を変更したりコールバックを作成したりする前に、すべてのスレッドが想定どおりに終了していることを確認してください。

QT のスレッドと OpenMP のスレッドはまったく別のスレッドなので、問題はありません。

于 2011-09-19T06:52:25.537 に答える