我的程序中有一个主线程,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线程工作,真是非常头疼,请教各位朋友这是为什么?
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线程工作,真是非常头疼,请教各位朋友这是为什么?
解决方案 »
- 平时说的虚拟网卡,虚拟声卡是指网卡,声卡驱动吗?
- 怎样获取手动绘制的矩形的坐标?
- CString和wofstream配合输出问题
- 刚学C++的菜鸟问问题!using namespace std是什么?
- 问如何在桌面上绘制可随鼠标移动的虚线框?
- 请教:对局域网内的共享文件夹的问题!
- win2000下的2个问题。请帮帮忙啊!
- 编写dll,里面要调用另外dll中的函数,如何实现?
- 问几个超级简单的问题
- 类可以通过重载实现类型的自动转换,可类的指针怎么办?
- 各位大侠救救我吧:如何使相同的命令行参数只启动一个进程实例????最后8分了,抱歉!帮帮忙,给个思路!谢谢!
- 各位大侠救救我吧:如何使相同的命令行参数只启动一个进程实例????最后7分了,抱歉!帮帮忙,给个思路!谢谢!
最好这么写:
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的返回值是什么?
for (int i=0;i<10;i++)//假设10个工作线程
{
CreateThread(work); //这里同时记录工作线程的ThreadID;
}
CreateThread(main);//创建发送消息线程
====================================================================if (条件符合某个线程的要求)
{
while(!PostThreadMessage(WorkID,MSG,parm,0)) sleep(0);//投递消息通知给相应的工作线程
}这一句,会进行PostThreadMessage的返回检查,直到投递消息成功