【问题标题】:non-blocking io function instead of cin.get()非阻塞 io 函数而不是 cin.get()
【发布时间】:2012-05-04 08:43:29
【问题描述】:

我有一个 c++ 控制台应用程序,它可以选择通过按任意键(通过使用 kbhit() 实现)来中断,在这种情况下,它会打印它所做的事情并退出(或者可以留下来完成工作(一些录音)并且仍然打印反馈)。我正在为该控制台应用程序制作 ac# gui 应用程序(我正在从 c# 表单调用 exe 文件),而不是按键盘上的任何键,我正在使用发送 Environment.NewLine (或“\n ") 到重定向的输入,在 c++ 应用程序中,我现在必须使用与 kbhit() 不同的东西才能使其工作。我尝试使用 cin.get(),例如:

if (kbhit() || (cin.get() > 0))  
    stop_recording=true;  

但是 cin.get() 是一个阻塞函数,如果我想让控制台应用程序运行到最后,它不会在不按停止按钮的情况下关闭。是否有任何类似于 cin.get() 的函数实际上没有阻塞,或者可能是从 c# 向我的控制台应用程序进程发送“任意键”的不同方式?

【问题讨论】:

  • 能否使用其他 Windows 同步方法,例如命名为 Mutex 或 Semaphore?
  • 您有权访问此 C++ 控制台应用程序源代码吗?因为如果你这样做了,你可以通过线程来实现它:首先你会创建一个线程,它总是用 cin.get() 监听键盘,然后你会在一个单独的线程上运行应用程序的其余部分。这样您的应用程序就不会被阻止。
  • @AlexeiLevenkov:是的,我在 c++ 控制台应用程序中有一些信号量,但我不知道这会有什么帮助。
  • @Komyg:我可以访问 c++ 控制台应用程序源代码,我应该对其进行修改以使其能够工作。关于线程的有趣想法,我可以尝试,但代码不是我编写的,而且有点复杂,所以我必须真正研究它才能使其工作。另外,我希望它不会破坏应用程序的功能。

标签: c# c++ io nonblocking


【解决方案1】:

使用_getch() 插入cin.get()。 它是一个阻塞命令,但只执行它if ( _kbhit() ) 它会立即返回。

【讨论】:

    【解决方案2】:

    您可以尝试发送Ctrl+C to the console process 来触发其中断行为。

    如果需要继续,您可以检查命名的同步对象 - 即在您的 UI 进程中创建名为 Mutex/Semaphore(具有随机名称)并将此名称传递给控制台进程。控制台进程会不时检查一次(而不是 kbhit)是否仍然可以获取 Mutex/Semaphore,并在无法获取时停止。

    @Komyg 建议的另一个选项是专用一个线程来读取控制台并检查特定输入是否显示在那里。

    如果您希望程序之间有更多的通信,请搜索 IPC“进程间通信”以查看更多方法。

    【讨论】:

      【解决方案3】:

      在这里找到了一个非常简单的答案: Simple example of threading in C++。归功于 Edward Kmett。
      我碰巧在 c++ 应用程序中使用了 boost 库,所以我也可以使用 boost 线程实现。这很简单,这就是我的线程函数的样子:

      bool stopped=false;
      
      void inputSent() //
      {  
          if (kbhit() || (cin.get() > 0))  
              stopped=true;  
      
      }  
      

      以及稍后在 main.cpp 中:

      boost::thread stoppedThread = boost::thread(inputSent);  
      

      之后我只检查是否停止==true,并且我没有使用stoppedThread.join(我不知道这是否是错误的,因为我不知道程序何时结束,如果我是留下僵尸线程...也许有人可以启发我)。

      【讨论】:

        猜你喜欢
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        • 2010-11-17
        相关资源
        最近更新 更多