为什么这个例子只适用于断点
Why would this exemple only works with a breakpoint
我正在 C/C++ 中创建一个基本的控制台应用程序。
在下面的示例中,我以 50 毫秒的延迟重复向控制台写入一些字符,我希望它在我按下某个键时退出程序。
#include "pch.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
int PauseRet(int iDuree) {
unsigned int uiTemps = GetTickCount();
int iVal = 0;
do {
if (_kbhit()) {
iVal = _getch();
}
} while ((GetTickCount() - uiTemps) < (unsigned int)iDuree);
return iVal;
}
int main()
{
char c = 0;
int iTempo = 50;
while (true) {
putchar('a');
c = PauseRet(iTempo);
if (c) {
return 0;
}
}
}
我的问题是,在我的项目中,只有当我在此处放置一个断点时,它才会进入条件 if(c){...
:
if (_kbhit()) {
<BREAKPOINT> iVal = _getch();
}
我正在使用 visual studio 2017.
我在新项目的另一台 PC 上试过这段代码,没有遇到任何问题
我认为这与我的项目设置有关。
您可能 运行 遇到 _getch()
的小错误。在 SDK 10.0.17134.0
上,错误是 _getch()
将 return 按下的键,并在下一次调用时 return 0。
如果没有断点,_kbhit
可能 return 不止一次为真,这会将 0 放入 c
而你的 if(c)
将永远不会通过。
使用断点,一旦你按下该键,它就会停在那里,该键随后会及时释放,一旦你从断点继续,_getch()
将 return 按下的键,并且_kbhit
将不再 return 正确。一旦循环退出,您将在 c
中获得一个非零值。
要解决此问题,请通过 运行 VS 2017 设置再次更新您的 SDK 并更新(或降级到 4 月更新之前的内容)and/or 下载更新的 SDK 或使用 _getwch()
我正在 C/C++ 中创建一个基本的控制台应用程序。
在下面的示例中,我以 50 毫秒的延迟重复向控制台写入一些字符,我希望它在我按下某个键时退出程序。
#include "pch.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
int PauseRet(int iDuree) {
unsigned int uiTemps = GetTickCount();
int iVal = 0;
do {
if (_kbhit()) {
iVal = _getch();
}
} while ((GetTickCount() - uiTemps) < (unsigned int)iDuree);
return iVal;
}
int main()
{
char c = 0;
int iTempo = 50;
while (true) {
putchar('a');
c = PauseRet(iTempo);
if (c) {
return 0;
}
}
}
我的问题是,在我的项目中,只有当我在此处放置一个断点时,它才会进入条件 if(c){...
:
if (_kbhit()) {
<BREAKPOINT> iVal = _getch();
}
我正在使用 visual studio 2017.
我在新项目的另一台 PC 上试过这段代码,没有遇到任何问题
我认为这与我的项目设置有关。
您可能 运行 遇到 _getch()
的小错误。在 SDK 10.0.17134.0
上,错误是 _getch()
将 return 按下的键,并在下一次调用时 return 0。
如果没有断点,_kbhit
可能 return 不止一次为真,这会将 0 放入 c
而你的 if(c)
将永远不会通过。
使用断点,一旦你按下该键,它就会停在那里,该键随后会及时释放,一旦你从断点继续,_getch()
将 return 按下的键,并且_kbhit
将不再 return 正确。一旦循环退出,您将在 c
中获得一个非零值。
要解决此问题,请通过 运行 VS 2017 设置再次更新您的 SDK 并更新(或降级到 4 月更新之前的内容)and/or 下载更新的 SDK 或使用 _getwch()