【问题标题】:Getting terminal input with SDL window open?在 SDL 窗口打开的情况下获取终端输入?
【发布时间】:2013-02-25 18:42:03
【问题描述】:

我正在尝试制作一个使用 SDL 窗口的程序,这个窗口是通过一个包含要在窗口上执行的函数的对象来调用的。

我遇到的问题是我想通过终端接受输入,而终端又会调用命令以完成对象。

我尝试过使用多线程,但我发现我在主线程和 SDL 线程中都需要类的实例,解决这个问题的方法是全局类实例,但我认为这将是糟糕的编程.

有没有其他方法可以打开 SDL 窗口并在终端窗口中执行诸如 cin 之类的操作

【问题讨论】:

    标签: c++ sdl


    【解决方案1】:

    最好使用于 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();
            }
        }
    }
    

    【讨论】:

    • 嗯,我想我必须尝试一下,如果没有很长的代码,我似乎很难做我想做的事
    • 给你一个例子。
    猜你喜欢
    • 2019-02-17
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2020-08-15
    • 2021-06-26
    相关资源
    最近更新 更多