PostThreadMessage函数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
在写服务器程序里,很多地方都需要使用到线程池。特别现在多处理器的CPU越来越普及,使用多个线程池是明显提高服务器程序的性能。在以消息为基础的Windows系统里,使用消息来处理是最简单的线程池办法,不但使用起来简单,而且理解起来也很简单的方法。创建多个线程后,就可以根据线程的ID来向不同的线程发送消息,每个线程都处理自己的消息。而发送消息给线程的函数是PostThreadMessage函数。下面来演示怎么样使用这个函数。
 
函数PostThreadMessage声明如下:
 
WINUSERAPI
BOOL
WINAPI
PostThreadMessageA(
    __in DWORD idThread,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
BOOL
WINAPI
PostThreadMessageW(
    __in DWORD idThread,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define PostThreadMessage PostThreadMessageW
#else
#define PostThreadMessage PostThreadMessageA
#endif // !UNICODE
 
idThread是线程ID
Msg是发送的消息ID
wParam是消息参数。
lParam是消息参数。
 
调用函数的例子如下:
#001 //线程运行函数。
#002 //在这里可以使用类里的成员,也可以让派生类实现更强大的功能。
#003 //
#004 DWORD CThreadMsg::Run(void)
#005 {
#006  //创建线程消息队列。
#007  MSG msg;
#008  PeekMessage(&msg, NULL, WM_USER, WM_USER+1000, PM_NOREMOVE);
#009 
#010  //
#011  for (;;)
#012  {
#013         //查找是否有线程消息处理。
#014         BOOL bRes = PeekMessage(&msg, NULL, WM_USER, WM_USER+1000, PM_REMOVE);
#015        if (bRes)
#016        {
#017              //在这里处理本线程的消息。
#018              ::OutputDebugString(_T("CThreadMsg::Run() 有消息处理/r/n"));
#019        }
#020         else
#021         {
#022               //等线程退出事件。
#023               DWORD dwRet = WaitForSingleObject(m_hEventExit,0);
#024               if (dwRet == WAIT_TIMEOUT)
#025               {
#026                    //目前没有做什么事情,就让线程释放一下CPU
#027                    Sleep(10);
#028               }
#029               else
#030               {
#031                    //退出线程。
#032                    ::OutputDebugString(_T("CThreadMsg::Run() 退出线程/r/n"));
#033                    break;
#034               }
#035         }
#036  }
#037 
#038  //
#039  return 0;
#040 }
 
上面实现线程的消息处理。
 
#001 class CThreadMsg :
#002  public CThread
#003 {
#004 public:
#005  CThreadMsg(void);
#006  virtual ~CThreadMsg(void);
#007 
#008  //发送一条消息给线程处理。
#009  //
#010  void PostMessage(void)
#011  {
#012         //
#013        ::PostThreadMessage(m_dwThreadID,WM_USER+100,0,0);
#014  }
#015 protected:
#016  virtual DWORD Run(void);
#017 };
 
上面是调用函数PostThreadMessage发送消息给线程处理。
MFC线程之间互相发送消息:PostThreadMessage MFC中可以使用PostThreadMessage指定线程ID单独发送消息,线程也可以用GetMessage函数接收消息; (1)PostThreadMessage函数: PostThreadMessage用法:添加链接描述; 函数原型:BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM IParam); (2)G... 阅读详情

相关推荐

使用PostThreadMessage在VC++中实现线程间的通信

请注意,PostThreadMessage函数只适用于在同一个进程中的线程间通信,如果涉及到跨进程通信,需要使用其他的机制,如邮槽、命名管道或共享内存等。在main函数中,我们创建了发送方线程和接收方线程,并使用CreateThread函数将线程函数与线程句柄关联起来。首先,我们需要创建两个线程,一个作为发送方,另一个作为接收方。在这个示例中,我们使用GetCurrentThreadId函数获取当前线程的ID,并将其作为目标线程的ID传递给PostThreadMessage函数函数是接收方线程的入口点。

YOLO_CODE的博客 303

线程间通讯:PostThreadMessage(C++和Qt中如何使用)

主要介绍PostThreadMessage,以及如何使用

bigger_belief的博客 2776

VC++调用PostThreadMessage给线程发消息,实现线程间的通信(附源码)

调用PostThreadMessage给线程发消息,实现线程间的通信。本文详细讲解了使用PostThreadMessage时要注意的细节问题。

dvlinker的技术专栏 9956

PostThreadMessage

PostThreadMessage 向线程发送消息 说明: 函数功能:该函数将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。   函数原型:      BOOL PostThreadMessage(   DWORD idThread,   UINT Msg,   WPARAM wParam,   LPARAM IParam); 参数   idThr

rbmwjyc的博客 3862

函数PostThreadMessage

功能:将一个消息寄送到指定线程的消息队列里,不等待线程处理就返回。 函数原型: BOOLPostThreadMessage( _In_ DWORD idThread, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam); idThread:线程标识符 Msg:指定被寄送的消息类型 wParam:指定附加的消...

weixin_30657541的博客 182

Windows API一日一练(48)PostThreadMessage函数

在写服务器程序里,很多地方都需要使用到线程池。特别现在多处理器的CPU越来越普及,使用多个线程池是明显提高服务器程序的性能。在以消息为基础的Windows系统里,使用消息来处理是最简单的线程池办法,不但使用起来简单,而且理解起来也很简单的方法。创建多个线程后,就可以根据线程的ID来向不同的线程发送消息,每个线程都处理自己的消息。而发送消息给线程的函数PostThreadMessage函数。下

移动开发与培训 295

Windows API一日一练 48 PostThreadMessage函数

Windows API一日一练 48 PostThreadMessage函数

uytrrfg的博客 460
上一篇: CreateSemaphore和ReleaseSemaphore函数
下一篇: SetThreadPriority和GetThreadPriority函数
seven-soft
博客等级 码龄14年 604粉丝 979原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值