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

原创 2007年10月11日 23:16:00
在写服务器程序里,很多地方都需要使用到线程池。特别现在多处理器的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 //蔡军生 2007/10/11 QQ:9073204 深圳
#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  //蔡军生 2007/10/11 QQ:9073204 深圳
#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发送消息给线程处理。
 
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caimouse/article/details/1820891

用C++Builder创建数字签名

用C++Builder创建数字签名      如果你在网络上传递一份数据,但却存在着种种不安全的因素,使你对数据能否原封不动地到达目的地而心存疑惑,这时,你就可以给数据加上数字签名,从而使对方可以通过...
  • holyfire
  • holyfire
  • 2001-04-10 09:19:00
  • 759

PostThreadMessage函数

在写服务器程序里,很多地方都需要使用到线程池。特别现在多处理器的CPU越来越普及,使用多个线程池是明显提高服务器程序的性能。在以消息为基础的Windows系统里,使用消息来处理是最简单的线程池办法,不...
  • softn
  • softn
  • 2016-06-22 06:05:45
  • 804

使用PostThreadMessage向工作线程发送消息

把window线程间传送消息仔细的看了一遍,觉得以前的理解很不深刻。说一说对PostThreadMessage的理解。 PostThreadMessage是一个线程体发送一个消息到指定的线程ID,其原...
  • liuliu20036
  • liuliu20036
  • 2009-02-11 22:38:00
  • 12224

PostThreadMessage的正确用法

1.使用PostMessage向某个线程发送消息,这个线程必须有消息队列,而消息队列是系统为线程创建的,调用PeekMessage或GetMessage会强制系统为该线程创建消息队列 2.消息循环可以...
  • mos2046
  • mos2046
  • 2014-09-23 05:42:24
  • 13601

使用PostThreadMessage在Win32线程间传递消息

PostThreadMessage可以用于线程之间的异步通讯,因为它不用等待调用者返回,这也许是线程通讯中最简单的一种方法了。 PostThreadMessage是一个Windows API函数。其...
  • jiangqin115
  • jiangqin115
  • 2015-07-21 15:13:26
  • 2166

PostMessage与PostThreadMessage的区别

原文:http://topic.csdn.net/u/20100107/11/161c95f0-eec2-45fc-a433-f50ec725f09e.html PostMessage与PostTh...
  • gencheng
  • gencheng
  • 2013-07-19 10:05:27
  • 10873

PostThreadMessage function----MSDN

原文地址::http://msdn.microsoft.com/en-us/library/ms644946(VS.85).aspx Posts a message to the mess...
  • xqhrs232
  • xqhrs232
  • 2014-01-25 15:19:51
  • 944

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

在写服务器程序里,很多地方都需要使用到线程池。特别现在多处理器的CPU越来越普及,使用多个线程池是明显提高服务器程序的性能。在以消息为基础的Windows系统里,使用消息来处理是最简单的线程池办法...
  • hejishan
  • hejishan
  • 2008-04-01 16:11:00
  • 154

Windows核心编程 第26章 窗口消 息

窗 口 消 息     Wi n d o w s允许一个进程至多建立10 000个不同类型的用户对象(User object):图符、光标、窗口类、菜单、加速键表等等。当一个线程调用一个函数来建立某...
  • u013761036
  • u013761036
  • 2017-01-12 00:44:18
  • 156

介绍一个线程封装类(CThread)

线程是编程中一个重要的概念。为了充分利用cpu,程序常采用多线程处理。操作系统与线程相关的函数皆为 c 函数接口。直接使用API生成和使用线程,不符合面向对象的处理逻辑。    本文介绍一个线程封装...
  • gjy938815
  • gjy938815
  • 2013-09-04 21:31:03
  • 502
收藏助手
不良信息举报
您举报文章:Windows API一日一练(48)PostThreadMessage函数
举报原因:
原因补充:

(最多只允许输入30个字)