• 用消息在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. }   
  • 相关阅读:
    矩阵快速幂 ZOJ 3497 Mistwald
    线段树(多棵) HDOJ 4288 Coder
    线段树(区间操作) POJ 3325 Help with Intervals
    BestCoder Round #75
    BestCoder Round #74 (div.2)
    DP ZOJ 2745 01-K Code
    Java IO file文件的写入和读取及下载
    Java时间和时间戳的相互转换
    Base64编码密钥时关于换行的几个问题。
    解决IllegalBlockSizeException:last block incomplete in decryption异常
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4487906.html
Copyright © 2020-2023  润新知