Sign in to follow this  
likeregularchickens

lower CPU usage when resizing

Recommended Posts

Hi, I've developed a program and i've been trying to find the cause of a few problems, and i've discovered that it's giving me 100% CPU usage after about a minute of running. The program isnt really that complicated so it shouldnt be doing this. BUT i noticed by accident that if i click the edge of the window to resize but dont release, the usage drops to about 50%, then shoots back up when i let go. The window is a plain white window, no icons buttons or anything just a plain white background from a 'your first win32 app' example. I cant think why though. There has always been something wrong with my computer though, because the CPU temp jumps really high when under not huge amounts of work. But can anyone shed some light as to why holding on when resizing makes such a difference? Thanks.

Share this post


Link to post
Share on other sites
100% CPU usage is caused by your program not letting Windows to process other tasks. If you have an unlimited loop somewhere in your program (which is very likely since it's GUI), you should somewhere in the middle of the loop let Windows to handle other tasks, although however, a correct handling of your program messages should automatically handle this. If all else fails, try Sleep().

Share this post


Link to post
Share on other sites
There's the unlimited loop that uses PeekMessage within it, but there's no other work there. All the work done is from an interrupt timer called every 10milliseconds through timeSetEvent. So i would have thought i'm letting windows do everything it needs to since there is a message handler there?

Thanks for the reply.

Share this post


Link to post
Share on other sites
If there's an infinite loop that's always going around and around and around and around, without ever pausing, of course you're going to have 100% CPU utilization.

Share this post


Link to post
Share on other sites
yeah that does make sense, but its just this:

//Message handler:
LRESULT CALLBACK WndProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
// Process the message
switch (msg)
{
// Check for key press
case WM_KEYDOWN:
{
// Check for ESC key press
if (VK_ESCAPE == wParam)
{
// Destroy the window
DestroyWindow(hwnd);
break;
}
}break;

// Check for window closing
case WM_CLOSE:
case WM_DESTROY:
{
// Post a quit message on the queue
PostQuitMessage(0);
break;
}break;

default:
{
// Handle any unprocessed message
return DefWindowProc(hwnd, msg, wParam, lParam);
}break;
}

return(0);
}


// main loop:
while (1)
{
// Check message queue
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// Is it a quit message?
if (WM_QUIT == msg.message)
break;

// Translate and dispatch message
TranslateMessage(&msg);
DispatchMessage(&msg);
}

}





and this is what i've seen in pretty much every 'learn win32' book and tutorial. Is this the wrong way to do it?

Share this post


Link to post
Share on other sites
Consider a long, involved infinite loop to be like counting to a million, over and over and over again. Consider a tiny infinite loop to be like counting to three, over and over and over again. Now, tell me: Do you spend any less time counting when you count to three over and over again?

To fix this issue: Don't use PeekMessage. Use GetMessage, which will pause until a message is actually received. Of course, there are situations where you don't want to pause.

Share this post


Link to post
Share on other sites
PeekMessage checks to see if there is a message in the queue. It does not block, so whenever you do not have a pending message your message handling loop is equivalent to:
while (1)
{
}

which is a busy waiting loop in which the processor will continuously be checking that 1 is not false (which it isn't and never will be). The alternatives are to either use GetMessage instead of PeekMessage, which waits for a message in a non-busy manner before returning, or to add a call to Sleep in your loop to give up the processor to other processes for a time.

Enigma

Share this post


Link to post
Share on other sites
Beautiful....
GetMessage works perfectly. I guess peekmessage is for people who like the old way of doing things?
If you knew you would need complete processing power is it ok to use peekmessage or should you always be as friendly with windows as you can?

Thanks alot for your help guys.

Share this post


Link to post
Share on other sites
PeekMessage isn't older; it's just a different function. It's used in situations where you don't want your control-flow to be fully event-driven. Games use a PeekMessage-based loop quite often. That's because things in a game are happening in realtime, not just whenever you click the mouse.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this