私と友人は、Boost::Python を使用するアプリケーションを開発しています。Boost::Python を介して C++ でインターフェイスを定義し、Boost::Python から継承してクラスを作成する必要があるユーザーに公開しました。このクラスは、アプリケーションが取得してコールバック メカニズムに使用します。
これまでのところ、すべてがうまくいっています。ここで、関数のコールバックには時間がかかる場合があります (ユーザーが重いものをプログラムした可能性があります)...しかし、ウィンドウを再描画する必要があるため、「動かなくなった」ようには見えません。 . 一度に実行されるコールバックは 1 つだけです (他のスレッドが同時に python を呼び出すことはありません)。 Python 用にラップされた C++ コード。
私たちがしていることは、Py_Initialize() の直後に PyEval_InitThreads() を呼び出すことです。それから、独自のブースト スレッド内でコールバック関数を呼び出す前に、マクロ PY_BEGIN_ALLOW_THREADS を使用し、スレッドが終了したときにマクロ PY_END_ALLOW_THREADS を使用します。
実行が 2 番目のマクロに到達しないと言う必要はないと思います。実行するたびにいくつかのエラーが表示されます...しかし、実際のコールバックを呼び出している間は常にエラーが発生します。私はよくグーグルで検索し、スレッドに関するいくつかのPEPドキュメントを読みましたが、それらはすべて、Pythonモジュール内のスレッド化(純粋な仮想クラスが公開されているだけだとは思いません)またはPython内のスレッド化について話し、メインについてではありません複数のスレッドから Python を呼び出すアプリケーション。
助けてください、これは私を数時間イライラさせてきました。
Ps。ヘルプ!