Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17


Sending a "quit" message

Posted on 2002-07-12
Medium Priority
Last Modified: 2013-11-20
I have an endless loop that collects data from a port and displays it, but I have no way for the user to exit the program.

Is there some way to have the user click a button or something and have the loop terminate?  The normal handler functions don't work because execution never leaves my "Get/Display" loop.
Question by:Hep_Cat
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Expert Comment

ID: 7150403
There are couple ways to do that

1. Start worket thread ( Let's say using _beginthread or any other way) and run you loop in that thread calling Sleep(1) in a loop to let main aplication some time for processing.

2. Incorporate messsage pump into you loop

something like
   MSG msg;

   while( GetMessage( &msg, NULL, 0, 0 ) )
     TranslateMessage( &msg );
     DispatchMessage( &msg );
  / do your stuff here....

I like first method.

Hope it helps...

Expert Comment

ID: 7150612
@ mblat:

Your code doesn't work: the "do your stuff here..." is called after a WM_QUIT-message has been posted - this is the only case in which GetMessage returns FALSE. I also doubt that this type of message-loop is accessible in an MFC-application. P.S.: The correct use of the Sleep()-call would be: Sleep( 0 ) which passes all remaining time from the thread's time slice to other threads running in the same process.

@ Hep_Cat:

You have two alternatives, an easy-but-dirty-hack or the clean way to go:
* dirty-hack: use
exit( 0 );
and your application will terminate instantly. If you use this on win 9x systems it will get unstable after a while since no memory clean-up is performed and resources aren't freed at program termination.
* Put your Get/Display-loop on a second thread and terminate this thread when the user wants to exit your program. The easiest way to approach this would be to create an event (look up CreateEvent in MSDN). If the user wants to terminate your application put it in signalled state. In your Get/Display-loop put a WaitForSingleObject-call to see whether program termination was requested and act accordingly. After you signalled the event upon user request to terminated wait for your Get/Display-thread to terminate and finally exit the application.

Expert Comment

ID: 7150893
2 fll0yd - you right it should be

        if (PeekMessage (&wmsg, NULL, 0, 0, PM_REMOVE))
        if(wmsg.message == WM_QUIT)

// do the stuff here....

as far as it being correct usage in MFC type apps - while it is not "clean" way - ( an I mentioned that I prefer way with threads ) I've seen it done all over the place.  It works.
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.


Expert Comment

ID: 7151407
This type of message-loop is *CLEAN* coding style and is being used in the majority of games, I'd say. It doesn't work with MFC though and needs to be adjusted:
* the "return;"-statement should be replaced by a "break;" to make the code cleaner, ie process clean-up directly after the 'infinite' loop.
* you need to initialize your wmsg-structure if you want to be safe
* you need to replace "if( PeekMessage( ..." by "while( PeekMessage( ..." otherwise your application can expose awkward behaviour [handling one message at a time and interleaving it with your own -- possibly computationally expensive -- code]


MSG wmsg = { 0 };
while( true ) {
    while( PeekMessage( &wmsg, NULL, 0, 0, PM_REMOVE ) ) {
        if( WM_QUIT == wmsg.message )
        TranslateMessage( &wmsg );
        DispatchMessage( &wmsg );
    // do the stuff here...
// perform clean-up code

This is the way to go. Might sound like nitpicking and marginal changes, but they certainly have immense impact on the application's behaviour.
LVL 49

Accepted Solution

DanRollins earned 400 total points
ID: 7152066
I think that all Hep_Cat wants is a way to let the user break out of the loop.  Form there, the question of exiting the program takes care of itself (the user can then click the Close button or whatever.

In that case, add a button named "Stop Looping" somewhere.  Make its button handler look like:

void OnStopLooping()
   m_fAbort= TRUE;  // m_fAbort is dlg member variable

Next add this fn somewher:

void KeepUiActive()
     MSG msg;
     while( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) {

And in your endless loop, add code like this:

if (m_fAbort) {
   // ... code here to stop the exit the loop

The message pump lets the framework notice and respond to the clicks of buttons.  It also lets the user drag the window around and other important U/I stuff.  With that happening all you need is a mechanism to break out of the loop when the user has clicked a button.  That's the m_fAbort variable.

-- Dan


Author Comment

ID: 7157699
This was the simplest.  And it had the most complete code examples.  Worked very well.

Featured Post

On Demand Webinar: Networking for the Cloud Era

Did you know SD-WANs can improve network connectivity? Check out this webinar to learn how an SD-WAN simplified, one-click tool can help you migrate and manage data in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Here is how to use MFC's automatic Radio Button handling in your dialog boxes and forms.  Beginner programmers usually start with a OnClick handler for each radio button and that's just not the right way to go.  MFC has a very cool system for handli…
In this post we will learn different types of Android Layout and some basics of an Android App.
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
This course is ideal for IT System Administrators working with VMware vSphere and its associated products in their company infrastructure. This course teaches you how to install and maintain this virtualization technology to store data, prevent vuln…

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question