3

lua関数をC++ハンドラーに追加できるコールバックシステムがあります。たとえば、luaで実行できます

myCObject:AddCallback(luaFunc)

コルーチンについても同じです

myCObject:AddCallback(coroutine.create(luaFunc))

その後、使用できます

lua_State * pThread = lua_tothread(L, -1);
lua_resume(pThread, 0,0);

C++で

lua 関数を開始/再開します。

今、私はスクリプト ライターに coroutine.create(luaFunc) を書くように要求したくありません。そして、lua func をコルーチンに自動的に "変換" したいだけです。AddCallback が呼び出されると、スタックに luaFunc があります。(coroutine.createを使用すると、すでにスタックにスレッドがあります)

編集: lua_newthread などの C API を使用するソリューションを探しています

4

2 に答える 2

10

アイデアはかなり単純です。まず、新しいスレッドを作成します。

lua_State *pThread = lua_newthread(L);

この関数は、そのスレッドをにプッシュしますL。次のステップは、スレッド関数をに取得することpThreadです。この時点でスタックにLua関数があるとすると、次のステップはその関数をpThreadスタックに転送することです。

スレッド間で値を転送するための特別な関数がありますlua_xmove。ただし、スタックの最上位の要素のみを転送します。Lしたがって、Lua関数をスタック上の場所からスタックの一番上にコピーする必要がありLます。次にlua_xmove、新しいスタックに移動します。

lua_pushvalue(L, #); //Where # is the index in the stack where the function is.
                     //Remember that lua_newthread pushed a value on the stack, so compensate for that.
lua_xmove(L, pThread, 1); //Moves the function to the top of the new stack.

lua_xmove 値を移動し、から削除することを忘れないでくださいL。したがってlua_pushvalue、値をプッシュしてlua_xmoveポップします。したがって、スタックの最上位は再び。でlua_State表されpThreadます。

その後、関数に送信する必要のあるすべてのパラメーター(明らかにゼロ)をプッシュして、再開します。

lua_resume(pThread, 0, 0);

合計コード:

lua_State *pThread = lua_newthread(L);
lua_pushvalue(L, #); //Where # is the index in the stack where the function is.
                     //Remember that lua_newthread pushed a value on the stack, so compensate for that.
lua_xmove(L, pThread, 1); //Moves the function to the top of the new stack.
lua_resume(pThread, 0, 0);

Luaスレッド(Luaで作成されたかC APIで作成されたかに関係なく)は、テーブル、ユーザーデータ、文字列などと同様にLua値です。したがって、ガベージコレクションの対象になります。Luaが値への参照がなくなったことを検出すると収集されます。

注意:lua_newthreadスレッドを元のスタックにプッシュします。それをレジストリ、グローバル環境、またはそのスレッドを永続的に存在させる予定の場所にコピーするのはあなた次第です。lua_State生成されたポインタへのポインタを保持するだけでは、スレッドが存続することは保証されません。

于 2012-07-08T17:48:13.400 に答える
2

私は長い間多くのことをしていないluaので、少しさびています。しかし、あなたがやりたいことは次のとおりだと思います:

  • を抽出しますluaFunc
  • coroutine.create次に、機能をプッシュします
  • luaFunc次に背中を押す
  • lua_pcallスタックにスレッドを取得するために使用します。

あなたのコメントから、あなたは使いたいですlua_newthread。私はそれについての経験はありませんが、それを使用しているサンプルプログラムを含むこの回答を見つけました。

于 2012-07-08T00:17:29.853 に答える