如何在关闭它时在控制台应用程序中中止getchar

时间:2009-10-29 10:14:26

标签: c++ winapi console

我编写了一个简单的命令行工具,它使用getchar来等待终止信号(类似于:'按Enter键停止')。然而,我也想处理SC_CLOSE案例(单击“关闭”按钮)。我是通过使用SetConsoleCtrlHandler完成的。但是如何取消我的getchar?

  • 我尝试过fputc('\n', stdin);,但这会导致死锁。
  • 我可以调用ExitProcess,但是当删除全局CWnd时,我在CThreadLocalObject :: GetData中崩溃了,因为CThreadLocalObject已经被删除了(好吧,也许我说谎时声称它是一个简单的控制台应用程序)。我想这可能与HandlerRoutine是从一个单独的线程(而不是主线程)调用的事实有关。
  • 也许有某种类型的getchar超时,我可以调用它?

1 个答案:

答案 0 :(得分:4)

  

也许有某种类型的getchar超时,我可以调用它?

您可以异步读取控制台输入:

#ifdef WIN32
 #include <conio.h>
#else
 #include <sys/time.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
#endif
int main(int argc, char* argv[])
{
 while(1)
 {
#ifdef WIN32
  if (kbhit()){
   return getc(stdin);
  }else{
   Sleep(1000);
   printf("I am still waiting for your input...\n");
  }
#else
  struct timeval tWaitTime;
  tWaitTime.tv_sec = 1;   //seconds
  tWaitTime.tv_usec = 0;  //microseconds
  fd_set fdInput;
  FD_ZERO(&fdInput);
  FD_SET(STDIN_FILENO, &fdInput);
  int n = (int) STDIN_FILENO + 1;
  if (!select(n, &fdInput, NULL, NULL, &tWaitTime))
  {
   printf("I am still waiting for your input...\n");
  }else
  {
   return getc(stdin);
  }
#endif
 }
 return 0;
}

通过这种方式,您可以引入bool bExit标志,指示您的程序是否需要终止。您可以在专用线程中读取输入或将此代码包装到函数中并定期调用它。