【问题标题】:Breaking out of a loop with a keypress用按键打破循环
【发布时间】:2011-08-10 15:03:52
【问题描述】:

我正在编写一个 Win32 GUI 应用程序,它有一个循环,我只想在按下按键时重新启动。主循环已经在运行,我不能简单地重新启动它,所以我必须插入一个用户可以手动中断的“挂起”点。下面的代码代表了我在主循环末尾放置的内容。它应该通过将程序放入一个无限的子循环来暂停程序,该子循环只能在按下字母“q”时被打破。

for (;;)
 {
 char temp;
 temp = _getch();

 if (temp == 'q')
  {
  break;
  }
 }

这成功地使程序挂起,但按 'q' 不会结束循环。我知道使用 cin.ignore() 或 cin.get() 会更好,但由于某种原因,当我将 iostream 添加到标题列表时,我得到了一堆错误,所以我目前正在尝试使用 _getch( ) 带有 conio.h 标头。

非常感谢任何帮助。

【问题讨论】:

  • if(temp == 'q') 将使您的代码更具可读性。
  • 只是好奇,但是您从标题中得到了什么错误?
  • 你确定你的程序到达了这个循环吗?你验证了吗?
  • 执行无限循环并不是“暂停”程序的正确策略,除非您想测试风扇的速度。
  • @MGZero,这些是我在添加 iostream:1>c:\program files\microsoft visual studio 10.0\vc\include\cmath(19) 时遇到的几个错误:错误 C2061:语法错误:标识符 'acosf' 1>c:\program files\microsoft visual studio 10.0\vc\include\cmath(19):错误 C2059:语法错误:';'

标签: c++ break conio


【解决方案1】:

您可以拨打MessageBox

【讨论】:

  • 天才!谢谢,将尝试代替
  • 刚刚签到(这里是菜鸟)- 消息框会暂停我的主程序吗?
  • MessageBox 是模态的,所以它会阻塞调用它的线程,直到用户选择一个选项或关闭窗口。
  • 谢谢。在这种情况下,这非常有效。程序挂起,直到我按 Enter 键,程序才暂停。
【解决方案2】:

很难从您的问题中看出,但听起来您正在尝试在每次循环迭代后提示用户是否希望继续。我假设无限 for 循环位于主处理循环的末尾。

您不需要无限循环:_getch() 无论如何都会停止执行,直到按下一个键。事实上,您将条件包装在 for 循环中的事实是 break 的行为不像您想要的那样 - 您是 break 退出无限循环,但不是您的主处理循环。

例子:

while(1)
{
   // Do some processing
   for (;;)
   {
      char temp;
      temp = _getch();

      if (temp == 'q')
         break;   // This will break out of the for and continue the while
   }
}

对比

while(1)
{
   // Do some processing
   if ('q' == _getch())
      break;             // This will break out of the while
}

您还会注意到,由于 _getch() 返回 char,您可以只测试函数的返回码(除非您需要存储输入以供以后使用)。

【讨论】:

    【解决方案3】:

    您必须创建一个消息循环并等待 keydown 消息到达。 Try to check this example.

    在 Windows GUI 应用程序中,没有可从控制台读取的输入。

    【讨论】:

      【解决方案4】:

      您提到这是一个 Win32 GUI 应用程序。在进入循环时,您是否创建了任何可能具有输入焦点的窗口?如果是,您应该尝试捕获 WM_KEYDOWN/WM_KEYUP 消息。如果是控制台应用,看Console Functions特别是ReadConsole

      山姆

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-29
        • 1970-01-01
        相关资源
        最近更新 更多