15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


TRACE and PulseEvent

Rick Esterling -- rick@eco.twg.com
Monday, November 04, 1996

Environment: VC++ 4.2b, Windows NT 4.0 SP1 

Whenever I preceed a call to PulseEvent with a call to the TRACE macro, the
event doesn't "pulse", at least not as far as any call to
WaitFor...Object() can tell.  The following code is from a minimal console
app that demonstrates the problem even though it exists in GUI apps as
well.  Obviously, this only affects debug builds.

/************* STDAFX.H ***********/

#include 
#include 
#include 
#include 

#include 

/*************** TestApp.cpp ************/
#include "StdAfx.h"

LPTHREAD_START_ROUTINE ThreadProc( LPVOID lpParam );

/////////////////////////////////////////////////////////////////////
void main( ) {
   TRACE( "1 - main() entered\n" );

   CEvent* pEvt = new CEvent;

   TRACE( "1 - Starting second thread\n" );
   DWORD dwThreadID;
   HANDLE hThread = CreateThread( NULL, 
                                  0, 
                                  (LPTHREAD_START_ROUTINE) ThreadProc, 
                                  (LPVOID) pEvt, 
                                  0, 
                                  &dwThreadID );

   TRACE( "1 - Begin sleep...\n" );

   // Sloppy, yes, but in the interest of keeping this snippet short,
   // the following call ensures the second thread really gets started.
   // You should still verify everything happened in the correct order by
   // reviewing the output debug window.
   
   Sleep( 1000 );

   /*****************************************
   If the next line is not commented out, the event never "pulses", at 
   least not so far as WaitForS/MObject can tell
   ******************************************/

   TRACE( "1 - Calling PulseEvent\n" );

   pEvt->PulseEvent( );

   TRACE( "1 - main waiting for secondary thread to terminate\n" );
   WaitForSingleObject( hThread, 
                        INFINITE );

   TRACE( "1 - Deleting event\n" );
   delete pEvt;

}

/////////////////////////////////////////////////////////////////////
LPTHREAD_START_ROUTINE ThreadProc( LPVOID lpParam ) {
   TRACE( "2 - Thread started\n" );

   CEvent* pEvt = (CEvent*) lpParam;

   BOOL bContinue = TRUE;
   while( bContinue ) {
      
      TRACE( "2 - Waiting for event...\n" );
      DWORD dwResult = WaitForSingleObject( pEvt->m_hObject, 
                                            INFINITE );
      TRACE( "2 - Event signaled, checking\n" );
      if( dwResult == WAIT_OBJECT_0 ) {
         TRACE( "2 - Correct event signaled, exiting!\n" );
         bContinue = FALSE;
      }
   }
   return 0;
}

-----

Here's the debug output when the annotated line *is* commented out; i.e.,
when it works:

1 - main() entered
1 - Starting second thread
1 - Begin sleep...
2 - Thread started
2 - Waiting for event...
1 - main waiting for secondary thread to terminate
2 - Event signaled, checking
2 - Correct event signaled, exiting!
The thread 0xDC has exited with code 0 (0x0).
1 - Deleting event
The program 'C:\Tmp\TestApp\Debug\TestApp.exe' has exited with code 
1245104 (0x12FFB0).

-----

Here's the same output when the annotated line is *not* commented out;
i.e., when the program gets hung waiting for an event that never sets:

1 - main() entered
1 - Starting second thread
1 - Begin sleep...
2 - Thread started
2 - Waiting for event...
1 - Calling PulseEvent
1 - main waiting for secondary thread to terminate

-----

Note that this does not appear to be a CEvent problem as the SDK
counterparts to CEvent yield the same results.  That leads me to belive
this is a TRACE problem or, more specifically, an AfxTrace problem.

Searched MSDN, KB, etc., etc., and found this mentioned nowhere.  Thought
I'd bring it up here before I send it to the VC Bug Report web site.

Does anyone else have any details/comments on this one?  

Later,
Rick

------------------------------------------------------------------------

Richard A. Esterling            Attachmate Internet Products Group (IPG)
Senior Software Engineer        McLean, VA                  703-847-4500
http://widget.eco.twg.com:1080  http://www.attachmate.com




Mike Blaszczak -- mikeblas@nwlink.com
Saturday, November 09, 1996

At 17:20 11/4/96 -0500, "Rick Esterling"  wrote:
>Environment: VC++ 4.2b, Windows NT 4.0 SP1 

>LPTHREAD_START_ROUTINE ThreadProc( LPVOID lpParam );

Your thread function isn't correctly prototyped.

>   HANDLE hThread = CreateThread( NULL, 
>                                  0, 
>                                  (LPTHREAD_START_ROUTINE) ThreadProc, 
>                                  (LPVOID) pEvt, 
>                                  0, 
>                                  &dwThreadID );

The (LPTREAD_START_ROUTINE) cast is bogus and wouldn't be necessary if
you'd corrrectly prototyped your function.

Does the problem persist if you fix your code?

.B ekiM
http://www.nwlink.com/~mikeblas/
I'm afraid I've become some sort of speed freak.
These words are my own. I do not speak on behalf of Microsoft.





| Вернуться в корень Архива |