用消息在Win32控制台程序多线程间进行通讯


 
  1. #include <stdio.h>  
  2. #include <windows.h>  
  3. //#include <iostream>  
  4. //#include <process.h>  
  5.   
  6. #define UM_MSG1 (WM_USER + 1)  
  7. #define UM_MSG2 (WM_USER + 2)  
  8.   
  9. DWORD WINAPI Thread1(LPVOID para)  
  10. {  
  11.     DWORD dwThreadId = *(DWORD *)para;  
  12.     DWORD i = 0;  
  13.     TCHAR *p;  
  14.     char strTmp[100];  
  15.   
  16.     while(TRUE)  
  17.     {  
  18.         Sleep(1700);          
  19.         p = new TCHAR[10];  
  20.         sprintf_s(strTmp, 100, "Hello %d %x ", i++, p);  
  21.         PostThreadMessage(dwThreadId, UM_MSG1, (WPARAM)strTmp, (LPARAM)p);  
  22.         //delete []p;  
  23.     }  
  24.   
  25.     return 0;      
  26. }  
  27.   
  28. DWORD WINAPI Thread2(LPVOID para)  
  29. {  
  30.     char strTmp[100];  
  31.     DWORD dwThreadId = *(DWORD *)para;  
  32.     DWORD i = 0;  
  33.     TCHAR *p;  
  34.   
  35.     while(TRUE)  
  36.     {  
  37.         Sleep(3000);  
  38.         p=new TCHAR[10];  
  39.         sprintf_s(strTmp, 100, "World %d %x", i++, p);  
  40.         PostThreadMessage(dwThreadId, UM_MSG2, (WPARAM)strTmp, (LPARAM)p);  
  41.         //delete []p;  
  42.     }  
  43.   
  44.     return 0;  
  45. }  
  46.   
  47. int main()  
  48. {  
  49.     printf("UM_MSG1: 0x%x/r/n", UM_MSG1);  
  50.     printf("UM_MSG2: 0x%x/r/n", UM_MSG2);  
  51.   
  52.     DWORD dwValue = GetCurrentThreadId();  
  53.     HANDLE hThread1 = CreateThread(NULL, 0, &Thread1, &dwValue, 0, NULL); // &Thread1可写作Thread1, 都是函数指针.  
  54.     HANDLE hThread2 = CreateThread(NULL, 0, &Thread2, &dwValue, 0, NULL);  
  55.     CloseHandle(hThread1);  
  56.     CloseHandle(hThread2);  
  57.     MSG msg;  
  58.     while(GetMessage(&msg, NULL, 0, 0))  
  59.     {  
  60.         switch(msg.message)  
  61.         {  
  62.         case UM_MSG1:  
  63.         case UM_MSG2:  
  64.             printf("msg: 0x%x      w: %x   ws: %s     l: %x/r/n", msg.message, &msg.wParam, msg.wParam, msg.lParam);  
  65.             delete [](TCHAR *)msg.lParam;  //注释掉这句你就会看到堆内存地址变化  
  66.             break;  
  67.         default:  
  68.             printf("Unknown msg:0x%x/n",msg.message);  
  69.             break;  
  70.         }  
  71.         Sleep(1);  
  72.     }  
  73.   
  74.     return 0;  
  75. }   
原文地址:https://www.cnblogs.com/lvdongjie/p/4487906.html