メイン スクリプトの実行中に OLE イベントを取得できるようにする Ruby スクリプトを作成しようとしています。WIN32OLE_EVENT::message_loop を別のスレッドに移動し、他のスクリプト部分の実行中にイベント ハンドラーが同時に呼び出されることを期待しています。たとえば、このサンプル スクリプトの主な目的は、デバイスに接続し、irb コンソールの実行中にイベント メッセージを取得することです (標準出力に出力するだけです)。
require 'win32ole'
require 'irb'
sc = WIN32OLE.new("OPOS")
sc.Open("mydevice")
sc.ClaimDevice(5000)
sc.setproperty("DeviceEnabled", true)
sc.DataEventEnabled = true
sc.AutoDisable = true
$loop = true
esc = WIN32OLE_EVENT.new(sc)
esc.on_event() {|*args|
puts "SIGCAP Event #{args.inspect}"
$loop = false
}
Thread.new {
loop do
WIN32OLE_EVENT::message_loop
break unless $loop
sleep 0.5
end
}
IRB.start
WIN32OLE_EVENT::message_loop
このスクリプトを実行すると (ただし、一部がスキップされたため実行できません)、irb コンソールが表示され、Windows に接続された USB デバイスを操作するオブジェクトにアクセスし、さまざまなイベントを発生させるいくつかのメソッドを呼び出すことができ、これらのイベントが期待されます。 stdout への出力を確認するためだけに esc.on_event ブロック内。しかし、このブロックは呼び出されませんでした。しかし、irb コンソールに「exit」と書くと、サンプル スクリプトの最後の行がWIN32OLE_EVENT::message_loopであるため、イベントが取得されます。
メインスレッドでのみ機能する message_loop を呼び出し、他のスレッド内で呼び出すと、結果が得られないように見えます。
それを機能させる方法はありますか?追加の質問をお気軽に。ありがとう。