Solved

UpdateAllViews Crashes My App

Posted on 2006-10-26
10
265 Views
Last Modified: 2013-11-20
Hi Experts -

Easy question (hopefully) - developing a serial data monotoring utility. Every time I get new data on the bus I want to  display it in the main window. The set-up I have now is - the user hits a run button which calls onRun() from myDoc class - it opens up the serial port and it goes into an infinite while loop that polls the bus. If there is data on the bus - then it reads it and it calls UpdateAllViews(NULL) to make a call to pDC->TextOut(). This is crashing my application - any ideas?

Also - is it possible to put a flag on that infinite loop that'll get reset by another button (call it Stop)? So for example...

void MyDoc::OnCommandStop()
{
      stop_recv_flag = 1;
}

void MyDoc::OnCommandRun()
{
      while(!stop_recv_flag)
      {
            status = read_bus (data);
            if (status == ARS_GOTDATA)
            {
                 UpdateAllViews(NULL);      
            }                        
      }

      stop_recv_flag = 0;
      
      
}

So if I  hit the stop button to call OnStop will it break the while loop if stop_recv_flag is a global variable?
0
Comment
Question by:DizZzM
  • 5
  • 3
  • 2
10 Comments
 

Author Comment

by:DizZzM
Comment Utility
Hi Experts -

Found the solution, just needed to add

AfxGetApp()->PumpMessage();

inside of the while loop.

The 2nd question is still an open issue however so the points are still up for grabs. For some reason, when I hit OnStop(), the global 'stop_recv_flag' does get set but then I get an application error and it shuts down. I would have thought OnRun would have read the correct new value and kicked out of the loop nicely.

Any ideas?
0
 
LVL 22

Expert Comment

by:mahesh1402
Comment Utility
>>then I get an application error

What kind of error you are getting ?

-MAHESH
0
 
LVL 44

Assisted Solution

by:AndyAinscow
AndyAinscow earned 250 total points
Comment Utility
I guess that
void MyDoc::OnCommandStop()
{
     stop_recv_flag = 1;
}
is never being called when you hit the stop button.  Try putting a breakpoint onto the  stop_recv_flag = 1; and seeing if it is reached.



also
void DoEvents()
{  
      MSG msg;  
      while ( ::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE ) )
      {  
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
      }
}

void MyDoc::OnCommandRun()
{
     while(!stop_recv_flag)
     {
          status = read_bus (data);
          if (status == ARS_GOTDATA)
          {
               UpdateAllViews(NULL);    
          }  
DoEvents();   <<---------------- allow the message queue to be processed                
     }

     stop_recv_flag = 0;
     
     
}

0
 

Author Comment

by:DizZzM
Comment Utility
hi mahesh - it's a sharing violation. I step through with the debugger and OnStop() does execute and stop_recv_flag does get modified. The error occurs on return. Do I need some mutex around stop_recv_flag?

The weird part is I kept developing and troubleshooting last night and I started noticing that the error does not occur every single time which makes me further believe I just need some mutex around the variable but maybe I'm wrong.

Hi Andy - thanks for your solution. Got that part working after I posted my original question with AfxGetApp()->PumpMessage();.
0
 
LVL 44

Expert Comment

by:AndyAinscow
Comment Utility
My understanding is that the PumpMessage will only force the next message in the queue to be handled.  A DoEvents type function will force all waiting messages to be handled.
0
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
LVL 22

Expert Comment

by:mahesh1402
Comment Utility
>>The error occurs on return.

return means exactly where ? In loop ?? have you traced that ??? you may put a simple MessageBox() before UpdateAllViews to trace that...

-MAHESH
0
 

Author Comment

by:DizZzM
Comment Utility
return from the OnStop() call.  I'll do some more analysis now and see if I can dig any deeper.
0
 
LVL 22

Accepted Solution

by:
mahesh1402 earned 250 total points
Comment Utility
You have overrideen function OnUpdate() for all / any of your views ?

As said you may put messagebox before/after UpdateAllViews() to ensure its happening only when UpdateAllViews executed..

-MAHESH
0
 

Author Comment

by:DizZzM
Comment Utility
Hi Guys - just ended up using a CMutex around the stop_recv_flag assignment and it worked! I'll just split the points between you guys. Thanks again!

CMutex recv_Mutex;

void MyDoc::OnCommandStop()
{
recv_Mutex
     stop_recv_flag = 1;
}

void MyDoc::OnCommandRun()
{
     while(!stop_recv_flag)
     {
          status = read_bus (data);
          if (status == ARS_GOTDATA)
          {
               UpdateAllViews(NULL);    
          }                    
     }

     stop_recv_flag = 0;
     
     
}
0
 

Author Comment

by:DizZzM
Comment Utility
Sorry - got trigger happy on the send... heres the solution:

CMutex recv_Mutex;

void MyDoc::OnCommandStop()
{
     recv_Mutex.Lock;
     stop_recv_flag = 1;
     recv_Mutex.Unlock;
}

void MyDoc::OnCommandRun()
{
     while(!stop_recv_flag)
     {
          status = read_bus (data);
          AfxGetApp()->PumpMessage();

          if (status == ARS_GOTDATA)
          {
               UpdateAllViews(NULL);    
          }                    
     }

     stop_recv_flag = 0;
     
     
}
0

Featured Post

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

Introduction: Hints for the grid button.  Nested classes, templated collections.  Squash that darned bug! Continuing from the sixth article about sudoku.   Open the project in visual studio. First we will finish with the SUD_SETVALUE messa…
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
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.
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

744 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

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now