Archived

This topic is now archived and is closed to further replies.

DoomGaze

The Stupid Message loop Question

Recommended Posts

Okay, I've been staring at this for hours and I can't figure out for the life of me what's wrong. I was hoping someone on here would be kind enough to point out my (likely) trivial mistake. I was trying to get a basic framework up and running and ran into problems getting my window to close by itself. Whenever I hit close, the program either freezes or the window closes but the message loop keeps on trucking. Either I'm checking msg.message wrong or PostQuitMessage is not properly posting to the queue (SendMessage(WM_QUIT) doesn't work either). I got this code from the book "OpenGL Game Programming" by Hawkins & Astle. This code is copied verbatim from the book.
      
	bool done = false;

	while (!done)
	{
		PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE);

                // Either I'm checking this wrong or quit

                // messages aren't posting!

		if (msg.message == WM_QUIT)
		{
			done = true;
		}
		else
		{
			/* some rendering code */
			SwapBuffers(g_hdc);

			TranslateMessage(&msg);
			DispatchMessage(&msg);

		}
	}
      
Any ideas? DoomGaze [edited by - DoomGaze on March 3, 2003 2:11:58 PM] [edited by - DoomGaze on March 3, 2003 2:13:11 PM]

Share this post


Link to post
Share on other sites
Not sure if this'll help, but the relevant code from TOTWGPG 2nd ed. is:


    
while (TRUE)
{
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);

if (msg.message == WM_QUIT)
break;
else
{

TranslateMessage(&msg);
DispatchMessage(&msg);

}
//main game processing goes here

Game_Main();
}


I remember that it worked correctly and the only differences (aside from the hwnd parameter, rendering line and the above Game_Main call) wouldn't seem to affect this.

[edited by - kordova on March 3, 2003 2:39:08 PM]

Share this post


Link to post
Share on other sites
I''ve also got this book and that code differs slightly in mine, this is how it is written in my copy (copied exactly)


  
while(!done)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) //pending message?

{
if(msg.message == WM_QUIT) //if a quit message has been

{ //recieved you want to quit the

done = TRUE //application

}
else
{
//do stuff

TranslateMessage(&msg); //translate the message

DispatchMessage(&msg); //dispatch the message to Windows

}
}
}


its only a small difference but it might be worth trying out

Share this post


Link to post
Share on other sites
um...humm...
i don't know whats going on...change the hwnd parameter to NULL, and see if that helps.

[edited by - MattS423 on March 3, 2003 3:01:26 PM]

Share this post


Link to post
Share on other sites
Here is a correct message loop

while(msg.message!=WM_QUIT)

{


if(PeekMessage(&msg,0,NULL,NULL,PM_REMOVE))

{



TranslateMessage(&msg);

DispatchMessage(&msg);

}

else

{

// do game code here, no message was received

}

}


Share this post


Link to post
Share on other sites