1

プロトコルのデータ パケットを作成および解析するライブラリが Lua にあります。パケットを送信すると、宛先からの返信が返されることを期待しています。返信はテーブルに解析されます。次のような関数呼び出しを行うことができるように、このライブラリの周りにラッパーを書き込もうとしています:result = SendUnicast(dest,packetData)解析された応答テーブルが結果に返されるようにします。

私の問題は 2 つあります: 1) 受信メッセージが非同期で、実行中のスクリプトとは別のスレッドで受信され、2) 受信する次のパケットは必ずしも要求に対する応答ではないため、受信パケットを解析して一致させる必要があります。シーケンス ID。

現在のプログラム フローは次のようになります。

[C# UI スレッド]

  • ボタンクリック
  • Lua スクリプトの実行
    • SendUnicast を呼び出す
    • 応答を待つ

[C# データ スレッド]

  • 着信メッセージ
    • メッセージを Lua パーサー関数に渡す
    • シーケンスが待機中のコマンドと一致する場合、解析されたテーブルを保存し、ブロックされた再開

[C# UI スレッド]

  • Lua scipt は解析されたテーブルを返します

現在実行中のスクリプト (UIThread 内) をブロックするための適切な方法が見つからないようです。メッセージが解析されたときに呼び出されるコルーチンを作成するとwhile coroutine.status(co) ~= "dead"、lua インタープリターが強制終了されるようです。

編集

この問題を処理する正しい方法であるため、BMitch の回答を承認済みとしてマークしています。ただし、LuaInterface はコルーチンをサポートしていないため、コルーチンのサポートを自分で C# コードに追加する必要があったことに注意してください。

4

1 に答える 1

2

UIスレッドで、次を実行します。

while ((status=lua_resume(L_coroutine, 0)) == LUA_YIELD) {
  semaphore_wait(); /* whatever the appropriate C# call is */
}

「応答を待つ」は次のようになります。

while not results[my_result] do
  coroutine.yield()
end

「着信メッセージ」関数は、Luaでは次のようになります。

results[cur_result]=parsed_message

そして最後にC#「着信メッセージ」に戻って、適切なsemaphore_post()関数を呼び出します。

C#ひどい目に見えたら申し訳ありませんが、私はCLinuxのプログラマーなので、その側面を一般的なものにしようとしました。

于 2011-07-13T19:55:24.683 に答える