User define message is lost in the thread!!! 
Author Message
 User define message is lost in the thread!!!

I get a "Hello World" c window program.I add the some code which create a
thread and post thread message to the main thread.When I run the program and
move the window,some message from the sub-thread is lost!The result is
attached at the end .

Why?
Any advise is great!
Thank you!

#include "stdafx.h"
#include "resource.h"
#include <stdio.h>

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;        // current instance
TCHAR szTitle[MAX_LOADSTRING];        // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];        // The title bar text

// Foward declarations of functions included in this code module:
ATOM    MyRegisterClass(HINSTANCE hInstance);
BOOL    InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

FILE *f;
DWORD WINAPI ThreadProc(void* para)
{
 int i = 1;
 while (1) {
  PostThreadMessage((DWORD)para,WM_USER+1,0,i);
  i++;
  Sleep(100);

 }

Quote:
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
 MSG msg;
 HACCEL hAccelTable;

 // Initialize global strings
 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
 LoadString(hInstance, IDC_HW, szWindowClass, MAX_LOADSTRING);
 MyRegisterClass(hInstance);

 // Perform application initialization:
 if (!InitInstance (hInstance, nCmdShow))
 {
  return FALSE;
 }

 DWORD m_ThreadID;

CreateThread(NULL,0,ThreadProc,(void*)(GetCurrentThreadId()),0,&m_ThreadID);

 f = fopen("wm.txt","w+");
 hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_HW);

 // Main message loop:
 while (GetMessage(&msg, NULL, 0, 0))
 {
  if (msg.message==WM_USER+1){
   fprintf(f,"ID : %d\n",msg.lParam);
  }
  else
  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }

 fclose(f);
 return msg.wParam;

Quote:
}

//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this
function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
 WNDCLASSEX wcex;

 wcex.cbSize = sizeof(WNDCLASSEX);

 wcex.style   = CS_HREDRAW | CS_VREDRAW;
 wcex.lpfnWndProc = (WNDPROC)WndProc;
 wcex.cbClsExtra  = 0;
 wcex.cbWndExtra  = 0;
 wcex.hInstance  = hInstance;
 wcex.hIcon   = LoadIcon(hInstance, (LPCTSTR)IDI_HW);
 wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);
 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 wcex.lpszMenuName = (LPCSTR)IDC_HW;
 wcex.lpszClassName = szWindowClass;
 wcex.hIconSm  = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

 return RegisterClassEx(&wcex);

Quote:
}

//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable
and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;

Quote:
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND - process the application menu
//  WM_PAINT - Paint the main window
//  WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
 int wmId, wmEvent;
 PAINTSTRUCT ps;
 HDC hdc;
 TCHAR szHello[MAX_LOADSTRING];
 LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

 switch (message)
 {
  case WM_COMMAND:
   wmId    = LOWORD(wParam);
   wmEvent = HIWORD(wParam);
   // Parse the menu selections:
   switch (wmId)
   {
    case IDM_ABOUT:
       DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
       break;
    case IDM_EXIT:
       DestroyWindow(hWnd);
       break;
    default:
       return DefWindowProc(hWnd, message, wParam, lParam);
   }
   break;
  case WM_PAINT:
   hdc = BeginPaint(hWnd, &ps);
   // TODO: Add any drawing code here...
   RECT rt;
   GetClientRect(hWnd, &rt);
   DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
   EndPaint(hWnd, &ps);
   break;
  case WM_DESTROY:
   PostQuitMessage(0);
   break;
  default:
   return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;

Quote:
}

// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
 switch (message)
 {
  case WM_INITDIALOG:
    return TRUE;

  case WM_COMMAND:
   if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
   {
    EndDialog(hDlg, LOWORD(wParam));
    return TRUE;
   }
   break;
 }
    return FALSE;

Quote:
}

result :
ID : 1
ID : 2
ID : 3
ID : 4
ID : 5
ID : 6
ID : 7
ID : 8
ID : 9
ID : 10
ID : 11
ID : 12
ID : 13
ID : 14
ID : 15
ID : 16
ID : 17
ID : 18
ID : 19
ID : 20
ID : 60
ID : 61
ID : 62
ID : 63
ID : 64
ID : 65
ID : 66
ID : 67
ID : 68
ID : 69
ID : 70
ID : 71
ID : 72
ID : 73
ID : 74
ID : 75
ID : 76
ID : 77
ID : 78


Mon, 21 Feb 2005 20:39:17 GMT  
 User define message is lost in the thread!!!

Quote:
> I get a "Hello World" c window program.I add the some code which create a
> thread and post thread message to the main thread.When I run the program
and
> move the window,some message from the sub-thread is lost!

That's perfectly possible. Some things involving windows, like moving them,
or using MessageBox(), run their own internal message loops inside the Win32
APIs to be able to work. This means, however, that thread messages will be
discarded in those loops, as there is no way to dispatch them.

You could try, instead, posting the messages to a hidden window, which will
work, or just use some other form of communication, like your own queue
shared between the threads. Either one is not too hard to roll on your own.

--
Tomas Restrepo



Thu, 24 Feb 2005 22:51:48 GMT  
 
 [ 2 post ] 

 Relevant Pages 

1. User defined WM messages from worker thread

2. Q: Threads and user-defined windows messages

3. Windows.Forms.Message - processing a user defined Windows-message - 2nd try

4. User defined messages and the message loop

5. handling user-defined messages (WM_USER) with message maps

6. I am new to programming and am lost

7. Losing thread messages?

8. lost thread messages

9. How to post user-defined msg in a worker thread

10. user defined, attach to message

11. user defined messages

12. User defined messages..

 

 
Powered by phpBB® Forum Software