0

SDL ウィンドウを使用するプログラムを作成しようとしています。このウィンドウは、ウィンドウで実行する関数を含むオブジェクトを介して呼び出されます。

私が抱えている問題は、端末を介して入力を取得したいということです。これにより、オブジェクトが完了するコマンドが呼び出されます。

マルチスレッドを使用してみましたが、メインと SDL スレッドの両方でクラスのインスタンスが必要であることがわかりました。これを修正する方法はグローバル クラス インスタンスですが、これは悪いプログラミングだと思います。

SDL ウィンドウを開いて、ターミナル ウィンドウ内で cin などを実行する他の方法はありますか

4

1 に答える 1

0

I/O 目的の補助スレッドをできるだけ単純にすることをお勧めします。メイン スレッドですべてのロジックを処理し、値をミューテックス スタックにプッシュするスレッドを作成します。その後、メイン スレッドはスタックから任意の値をポップし、それに応じて反応することができます。コンソールで作業しているため、同時入力を行うことはできないため、スタックは必要ありません。簡単な例を次に示します。このコンピューターで機能するツールチェーンはありませんが、これは機能するはずです。

#include<string>
#include<sdl/sdl.h>
#undef main //I HATE SDL FOR REDEFINING MAIN

class asynccin{
    static std::string val;
    static int hasval;
    static void thread(void*a){
        cin >> val;
        hasval = 2;
    }
    public:
    static bool begininput(){
        if( hasval != 0 ) return false;
        hasval = 1;
        SDL_CreateThread( thread, NULL );
    }
    static bool hasinput(){
        return hasval == 2;
    }
    static std::string reapinput(){
        hasval = false;
        return val;
    }
};

int main{}{

    //init SDL
    while( true ){
        //loop stuff
        asynccin::begininput();
        if( asynccin::hasinput() ){
            cout << asynccin::reapinput();
        }
    }
}
于 2013-02-25T19:26:29.130 に答える