1

Ruby C 拡張機能として単純なウィンドウ ライブラリを実装しています。Windows にはhandle_events!、ネイティブ イベント ループに入るメソッドがあります。

問題は、ウィンドウごとに 1 つのイベント ループとメソッド ブロックが必要なことです。メソッドがすぐに戻り、ループが別のスレッドで実行されるようにしたいと思います。これを達成するための最良の方法は何ですか?

rb_thread_call_without_gvlイベント ループ関数rb_thread_call_with_gvlを呼び出すために使用してから、s であるウィンドウのコールバックを呼び出すために使用してみましたProc。完全なソース コードはここにあります。

それでも機能しますが、意図したとおりではありません。メソッドはまだブロックされています。これは Ruby のスレッド モデルでも可能ですか?

4

2 に答える 2

0

まったく同じ問題を解決する必要がありました。そして rb_thread_call_with_gvl() は 1.9.2 で実験的なものとしてマークされ、エクスポートされたシンボルではなかったため、別のアプローチをとりました:

ブロッキングの handle_event を呼び出しました! 別のスレッドから機能します。メッセージ キューでブロックされる 2 番目の Ruby スレッドを使用しました。メッセージキューでブロックしている間、gvl は rb_thread_blocking_region() で解放されました。

スレッドが handle_event! を呼び出している場合 イベントのためにブロックが解除された場合、Proc のアップコールに必要なすべての情報を一緒にキュー要素に取り込み、その要素をキューにプッシュしました。ruby スレッドは rb_thread_blocking_region() から返された要素を受け取ったので、gvl を再取得し、受け取った要素からの情報を使用して Proc を呼び出しました。

よろしくトルステン

于 2012-07-16T17:27:32.557 に答える