Lv.的博客

用消息在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. }   

 

 

posted @   Avatarx  阅读(457)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2014-05-08 qt sql 数据库操作
2014-05-08 sqlserver 触发器语法
2014-05-08 mysql 触发器语法详解
2014-05-08 sqlserver 触发器实例
2014-05-08 mysql 触发器示例
2014-05-08 qt 2D绘图技巧
点击右上角即可分享
微信分享提示