我的程序中有一个主线程,N个工作线程。主线程负责收集数据,然后分派给不同的工作线程去处理。我在程序中使用了PostThreadMessage()来通知相应的线程处理数据,而工作线程使用GetMessage()来进行相应。但现在的问题是:如果只启动一个工作线程,主线程的消息通知可以很正常的到达工作线程;但是如果同时启动的工作线程的数目多于一个,则好像每个工作线程都接收不到主线程的消息通知了(测试发现主线程确实也发出消息了),实在是不知道原因。代码流程如下:CreateThread(main);//主线程;
for (int i=0;i<10;i++)//假设10个工作线程
{
   CreateThread(work); //这里同时记录工作线程的ThreadID; 
}ThreadMain()
{
    if (条件符合某个线程的要求)
    {
      while(!PostThreadMessage(WorkID,MSG,parm,0)) sleep(0);//投递消息通知给相应的工作线程
    }
}ThreadWork()
{
    while(true)
    {
       iRet = GetMessage(msg,NULL,0,0);
       {
         ......此处省略对iRet的判断
         if (msg.message = MY_MSG)
         {
             进行相应处理
         }
       }
    }
}我在测试的时候,先限制只启动一个WORK线程,发现主线程的消息通知可以到达,WORK线程也能正确的处理相应的数据。但是如果启动2个或以上的WORK线程,即使再发送同前次测试一样的数据,主线程也发出了消息通知,但是就是无法激活相应的WORK线程工作,真是非常头疼,请教各位朋友这是为什么?

解决方案 »

  1.   

    有可能是线程的消息队列还没创建起来,你就给它发了消息,这样消息是会发送失败的。
    最好这么写:
    ThreadWork()
    {
        PeekMessage();//创建消息队列
        SetEvent();//每个线程对应一个事件
        while(true)
        {
           iRet = GetMessage(msg,NULL,0,0);
           {
             ......此处省略对iRet的判断
             if (msg.message = MY_MSG)
             {
                 进行相应处理
             }
           }
        }
    }
    在主线程里面
    ThreadMain()
    {
        WaitForMultipleObjects();//等待所有线程的消息队列创建完毕
        if (条件符合某个线程的要求)
        {
          while(!PostThreadMessage(WorkID,MSG,parm,0)) sleep(0);//投递消息通知给相应的工作线程
        }
    }
    另外你可以检测一下PostThreadMessage的返回值是什么?
      

  2.   

    另外,换一下顺序,先创建工作线程,在创建单独的那个工作线程(不能叫主线程,LZ说法有误哦)
    for (int i=0;i<10;i++)//假设10个工作线程
    {
       CreateThread(work); //这里同时记录工作线程的ThreadID; 
    }
    CreateThread(main);//创建发送消息线程
      

  3.   

    whwjn(哈哈) 说的不错,我的说法不正确,呵呵,主要是害怕表述不清楚,都是“工作线程”。
      

  4.   

    另外你可以检测一下PostThreadMessage的返回值是什么?
    ====================================================================if (条件符合某个线程的要求)
        {
          while(!PostThreadMessage(WorkID,MSG,parm,0)) sleep(0);//投递消息通知给相应的工作线程
        }这一句,会进行PostThreadMessage的返回检查,直到投递消息成功