0

私は非常に一般的であるに違いないと思う問題を抱えており、あなたのほとんどはそれに直面しているでしょう。私はluaでプログラムを作成しました。たとえば、main.luaは、キーイベントを受信すると、座標を変更してジオメトリ図を表示する必要があります。このluaコードはreg.cを呼び出し、そこで一種のレジスターになります。現在、reg.ciには、押されたキーを受け取り、それをキー処理を担当するlua関数に渡す関数エンジンがあります。しかし、キーイベントが発生するまでに、luaコードは登録を完了して終了するため、engine()からの呼び出しは不正なメモリアクセスになり、セグメンテーション違反が発生します。

また、lua呼び出しをreg関数にぶら下げたり、他の場所からエンジン関数を呼び出したりすることはできないと思います。

次に、解決策は何であるか、これを案内してください。


@jacob:これが私が達成しようとしていることのプロトタイプです:

function key_handler() //this function will get the latest key pressed from some other function
{
     draw.image();
     draw.geometry();
     ...
     ...

     while(1)
     {
         //draw Points until some condition goes wrong      
     }

}

さて、key_handlerに入ると、彼がポイントを描くのに忙しい間、失敗状態が発生しない限り、そしてそれまで、私はその時まで押されたキーを受け取ることができません。

この説明がもっと簡単で私の主張を理解し、他の人が問題を理解するのに役立つことを願っています。本当に申し訳ありませんが、表現したり、他人に理解してもらうのは苦手です。

もう1つ、C構文に従って説明しましたが、これはluaで完全に実装されています。

4

1 に答える 1

0

あなたのコード スニペットは、まだ大部分が有益ではありません (理想的には、ストックの Lua インタープリターでコードを実行し、問題を確認できるはずです)。Lua の問題を説明する場合は、Lua コードを使用して説明します。

しかし、私はあなたがどこに行きたいかを見始めています。

必要なことは、キー ハンドラーで呼び出されるコルーチンを用意することです。これにより、引数がハンドラーに返されます。

function isContinue() --just to simulate whatever function you use getting keypresses.
-- in whatever framework you're using there will probably be a function key_pressed or the like.
    print('Initialize checking function')
    while true do
        print('Continue looping?')
        local ans = io.read():match('[yY]')
        local action
        if not ans then
            print('Do what instead?')
            action = io.read()
            if action:match('kill') then -- abort keychecker.
                break
            end
        end
        coroutine.yield(ans,action)
    end
    print('finalizing isContinue')
    return nil,'STOP' -- important to tell key_handler to quit too, else it'll be calling a dead coroutine.
end

function key_handler()
    local coro = coroutine.create(isContinue)
    local stat,cont,action
    while true do
        print'Draw point'
        stat,cont,action = coroutine.resume(coro)
        if not stat then
            print('Coroutine errored:',cont)
        elseif not cont then
            print('isContinue interrupted keyhandler')
            print("We'll "..action.." instead.")
            break
        end
    end
    print('finalizing key_handler')
end

key_handler()
-- type something containing y or Y to continue, all else aborts.
-- when aborting, you get asked what to do instead of continuing, 
--- with "kill" being a special case.

これは一目瞭然です。おそらく、Lua でのプログラミングの第 9 章: コルーチン をよく見てください。

大きな問題 (共同スレッドに慣れていない場合) は、コルーチンがそれ自体を生成する必要があることです。制御を返すのは、呼び出し元の関数ではありません。

これがお役に立てば幸いです。

于 2012-07-04T08:00:32.930 に答える