7

標準の「lua_pcall」関数呼び出しよりも細かいレベルで C/C++ プログラムから Lua コードを実行する方法はありますか? 理想的には、低レベルのバイトコード命令のリストをループして (そのようなものがあると仮定して)、それらを 1 つずつ実行できるようにしたいと考えています。これにより、実行するだけでなく、より多くのことを制御できる独自のスケジューラーを作成できます。最初から最後まで完全な Lua 関数。

これを行う理由は、Lua コードが呼び出すことができる C 関数を実装したいためです。これにより、実行を続行する前に、プログラムが特定の (潜在的に長い時間がかかる) アクションが完了するまで待機するようになります。典型的な Lua スクリプトでは、このような関数呼び出しの割合が高いため、アクションが完了したらコールバックを使用するように書き直すという考えは、実際には実用的ではありません。

4

4 に答える 4

14

おそらく質問を回避しますが、カスタム C のものではなく Lua コルーチンを使用して、何らかのイベントが発生するまで待つことができます。

たとえば、1 つのコルーチンで waitForEvent() 関数を呼び出すことができます。そこで、そのイベントが発生するまで別のコロに切り替えてから、最初のコロを再開できます。詳細については、 lua coro docs をご覧ください

于 2009-03-14T20:22:26.983 に答える
6

コルーチンを使用するという Jder の提案は、Lua の協調スレッド (明示的生成) 機能を使用して、長時間待機する C ルーチンを記述できる場合に非常にうまく機能します。Lua に入るには lua_pcall() を使用しますが、エントリ ポイントはコルーチン マネージャー関数になります。

これは、C ルーチンが待機中に何もしない場合にのみ機能します。たとえば、何かを計算するために実行時間が長い場合は、複数の OS スレッドを実行する必要があります。Lua はスレッドセーフです。複数のスレッドを作成し、各スレッドで lua_open() を実行するだけです。

http://www.lua.org/pil/24.1.htmlから

Lua ライブラリでは、グローバル変数はまったく定義されていません。すべての状態を動的構造体 lua_State に保持し、この構造体へのポインターを引数として Lua 内のすべての関数に渡します。この実装により、Lua は再入可能になり、マルチスレッド コードで使用できるようになります。

2 つのアプローチを組み合わせることもできます。OS スレッドを開始するためのラッパー Lua 関数がある場合は、スレッドの開始後に譲歩できます。コルーチン マネージャーはスレッドを追跡し、開始したスレッドが終了するとコルーチンを続行します。これにより、純粋な C コードを実行する複数のワーカー スレッドで単一の Lua インタープリターを使用できます。

于 2009-03-14T20:56:40.693 に答える
5

OS スレッド方式を使用する場合は、 Lua Lanesをご覧ください。あなたが達成しようとしていることに対する完璧な解決策だと思います (= 1 つのアドオン モジュールをミックスに投入すると、マルチスレッドがシームレスに組み込まれた、明確で理解しやすくシンプルなコードを作成できます)。

問題がどのように解決されたか教えてください。:)

于 2009-03-15T23:10:24.217 に答える
2

デバッグ インターフェイスは役に立ちますか?

于 2009-03-14T20:19:06.650 に答える