所以,我有这个普通的while循环(如图所示),当我的程序在while循环内运行了很长一段时间时,窗口变得没有响应,说“等等等等没有响应”。嗯...我知道在WinAPI中我应该使用SetTimer()函数和WM_TIMER,但猜猜是什么!我这次编程很有趣,我想知道是否有一个解决方法......例如在我的while循环中添加一些内容以保持“响应”。我不是想破坏性的。
以下是代码:
while (battleupdate == 1)
{
RECT wrect;
wrect.left = 0;
wrect.right = 570;
wrect.top = 0;
wrect.bottom = 432;
if (FILLRECT == 0){
FillRect(hdc, &wrect, (HBRUSH) GetStockObject (WHITE_BRUSH));
cout << "battleupdated" << endl; FILLRECT = 1; }
/*OPPONENT STATS*/
if (1 == 1) { stringstream stream; stream << opname << " ";
TextOut (hdc, 20, 50, stream.str().c_str(), 12); }
//if (1 == 1) { stringstream stream; stream << itemslot4name << " ";
//TextOut (hdc, 465, 188, stream.str().c_str(), 12); }
//if (1 == 1) { stringstream stream; stream << itemslot4effect << " ";
//TextOut (hdc, 465, 204, stream.str().c_str(), 4); }
battleupdate = 1;
//I DON'T CARE IF MY DELAY CODE IS LAME YES I KNOW ABOUT SLEEP().
while (delay > 0)
{
delay -= 1;
}
if (delay == 0)
{
delay = resetdelay;
}
}
我问的可能吗?
我很感激任何答案,即使“不能这样做,你最好使用WM_TIMER!” 所以,提前感谢您的答案!
操作系统:windows 7 ultimate
编译器:Dev-C ++
其他:使用winapi
答案 0 :(得分:0)
如您所知,您应该使用计时器来处理您的逻辑...
但如果你真的不想这样做,你可以使用“DoEvents”来保持窗口“响应”......
void DoEvents()
{
MSG msg;
BOOL result;
while ( ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE ) )
{
result = ::GetMessage(&msg, NULL, 0, 0);
if (result == 0) // WM_QUIT
{
::PostQuitMessage(msg.wParam);
break;
}
else if (result == -1)
{
// Handle errors/exit application, etc.
}
else
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
}
在你的while循环中你只需要定期调用“DoEvents”......