Re: Windows Messaeg Queue Query

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



See below...
On Wed, 04 Mar 2009 15:13:35 +0000, John <reply@xxxxxxxxxxxxx> wrote:

Hi,

I have a problem with posting messages to a message queue. I've read
through the MSDN docs but they have not really answered the problem I am
expierencing.

The setup is as follows:

I have a thread that receives UDP messages from the network. When the
messages are received it posts a message like so

AtlTrace("Posting new message...");
PostMessage(WM_DATA_READY,6,0);

WM_DATA_READY is mapped to a function in the header using

BEGIN_MSG_MAP(CTestApp)
MESSAGE_HANDLER(WM_DATA_READY, OnDataReady)
END_MSG_MAP()

The function OnDataReady has the body

LRESULT CTestApp::OnDataReady(UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL& bHandled)
{
static int nCnt = 0;
AtlTrace("Entered OnDataReady function with nCnt = %d\n", nCnt);
****
never declare a static inside a function. Even for debugging, the idea sucks.
****

DWORD dwThreadID = GetCurrentThreadId();
AtlTrace("Thread ID = 0x%x\n", dwThreadID);

for(int nIndex=0; nIndex<5; ++nIndex)
{
AtlTrace("Loop number is %d\n", nIndex);
}
}

When I run the code I get the following output:

Posting new message...
Posting new message...
Posting new message...
Entered OnDataReady function with nCnt = 0
Thread ID = 0x9eb
Loop number is 0
Entered OnDataReady function with nCnt = 1
Thread ID = 0x9eb
Entered OnDataReady function with nCnt = 2
Thread ID = 0x9eb
Loop number is 1
Loop number is 2
Loop number is 3
Loop number is 4
Loop number is 1
Loop number is 2
Loop number is 3
Loop number is 4
Loop number is 1
Loop number is 2
Loop number is 3
Loop number is 4

Either my code is wrong or my understanding of the message queue is
wrong. How is it possible that the same thread can be in the same
function 3 times at the same time? As you can see from the output, the
loop has been run three times but for some reason the final two times it
has missed out the first interation???
****
You are presuming the AtlTrace messages are supposed to come out in sequence. In fact,
they rarely do. The tracing mechanism is itself asynchronous and messages will not be
guaranteed to be in order.
****

I can't even set up CRITICAL_SECTIONS inside the function because the
thread ID is always the same.
****
The desire to set up CRITICAL_SECTIONs shows you don't even understand the problem. I
cannot understand why you would want a CRITICAL_SECTION unless you have a very poor design
for your application. *of course* the thread ID is the same! It is *supposed* to be the
same! In fact, there is no way you can make it *not* be the same unless you have multiple
UI threads sharing the same handler.

But the whole point of using PostMessage is to avoid the need for CRITICAL_SECTIONs. So
the design is inherently flawed.
joe

Can anyone provide an explanation as to what is happening in the code?

Many thanks,

John.


Joseph M. Newcomer [MVP]
email: newcomer@xxxxxxxxxxxx
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm
.



Relevant Pages

  • Windows Messaeg Queue Query
    ... I have a problem with posting messages to a message queue. ... Entered OnDataReady function with nCnt = 0 ... Loop number is 0 ...
    (microsoft.public.vc.mfc)
  • Re: Windows Messaeg Queue Query
    ... I have a problem with posting messages to a message queue. ... Entered OnDataReady function with nCnt = 0 ... Loop number is 0 ...
    (microsoft.public.vc.mfc)
  • Re: Windows Messaeg Queue Query
    ... I have a problem with posting messages to a message queue. ... Entered OnDataReady function with nCnt = 0 ... Loop number is 0 ...
    (microsoft.public.vc.mfc)
  • Re: Windows Messaeg Queue Query
    ... I have a problem with posting messages to a message queue. ... Entered OnDataReady function with nCnt = 0 ... Loop number is 0 ...
    (microsoft.public.vc.mfc)
  • Re: Windows Messaeg Queue Query
    ... I have a problem with posting messages to a message queue. ... Entered OnDataReady function with nCnt = 0 ... Loop number is 0 ...
    (microsoft.public.vc.mfc)