zoukankan      html  css  js  c++  java
  • 用消息在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. }   
  • 相关阅读:
    (转) Hibernate检索方式概述
    (转) Hibernate注解开发
    (转)Hibernate关联映射——一对多(多对一)
    (转)学习淘淘商城第二十二课(KindEditor富文本编辑器的使用)
    (转)Hibernate关联映射——对象的三种关系
    (转)Hibernate的一级缓存
    (转) Hibernate持久化类与主键生成策略
    ( 转)Hibernate常用API
    (转)Hibernate的配置详解
    范仁义css3课程---22、float导致的父容器高度坍塌及解决
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4487906.html
Copyright © 2011-2022 走看看