Feb 202011
Occasionally I want to yield a tight loop to allow messages from the GUI to be updated. One way to do this is to put the loop processing in a thread, but if I don’t want to go to that trouble for something really simple, I sometimes just call this function at a safe place in the loop.
//
// Release main thread for background processing
//
void GiveTime()
{
// Idle until the screen redraws itself, et. al.
MSG msg;
while (::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) {
if (!AfxGetThread()->PumpMessage( )) {
::PostQuitMessage(0);
break;
}
}
// let MFC do its idle processing
LONG lIdle = 0;
while (AfxGetApp()->OnIdle(lIdle++ ))
;
}
For example:
for(int i = 0; i < 1000000; ++i) {
// Do something
GiveTime();
}
You may also want to throttle how often this happens to help the loop run faster.
for(int i = 0; i < 1000000; ++i) {
// Do something
if((i % 1000) == 0)
GiveTime();
}