多个线程可以共用一个目的窗口句柄吗解决方法

多个线程可以共用一个目的窗口句柄吗
本帖最后由 xiaoze6756 于 2013-10-01 17:38:41 编辑
创建了两个线程函数对应两个串口,对当前窗口句柄(目的窗口句柄)了解不是很清楚,是否可以共用一个,同时WM_MYMSG是否共用一个就可以
主要看一下25~29,65~69是否可以这么用2次,共用一个窗体句柄,共用一个消息!

截取了部分代码:
#define WM_MYMSG WM_USER+100
HWND hWnd;

DWORD ThreadProcEvent1(LPVOID pParam)
{
DWORD dwEvtMask1,dwRes1;
Eol1.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
while(hEventRun1)
{
WaitCommEvent(h_com1,   //监视串口事件
&dwEvtMask1,         //存放事件掩码组合值
&Eol1); //OVERLAPPED结构

dwRes1 = WaitForSingleObject(Eol1.hEvent,  //等待事件的对象句柄
100); //超时事件(ms)
switch(dwRes1)
{
case WAIT_OBJECT_0: //成功得到事件监视结果
switch(dwEvtMask1)
{
case EV_RXCHAR: // 接收到数据
if(!fStopMsg1)
{
fStopMsg1=true;
//向主线程发送消息,接收到数据
::PostMessageW(hWnd, //目的窗口句柄
WM_MYMSG, //消息名称
0, //传递参数1
(LPARAM)EV_RXCHAR); //传递参数2
}
break;
case EV_TXEMPTY: //发送缓冲区已经清空
AfxMessageBox(L"send buffer1 is empty");
//可以加入发送缓冲区空的处理代码,或向主线程发送消息
break;
}
break;
}
}
return true;
}


DWORD ThreadProcEvent2(LPVOID pParam)
{
DWORD dwEvtMask2,dwRes2;
Eol2.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
while(hEventRun2)
{
WaitCommEvent(h_com2,   //监视串口事件
&dwEvtMask2,         //存放事件掩码组合值
&Eol2); //OVERLAPPED结构

dwRes2 = WaitForSingleObject(Eol2.hEvent,  //等待事件的对象句柄
100); //超时事件(ms)
switch(dwRes2)
{
case WAIT_OBJECT_0: //成功得到事件监视结果
switch(dwEvtMask2)
{
case EV_RXCHAR: // 接收到数据
if(!fStopMsg2)
{
fStopMsg2=true;
//向主线程发送消息,接收到数据
::PostMessageW(hWnd, //目的窗口句柄
WM_MYMSG, //消息名称
0, //传递参数1
(LPARAM)EV_RXCHAR); //传递参数2
}
break;
case EV_TXEMPTY: //发送缓冲区已经清空
AfxMessageBox(L"send buffer2 is empty");
//可以加入发送缓冲区空的处理代码,或向主线程发送消息
break;
}
break;
}
}
return true;
}
线程 串口 窗体 句柄

------解决方案--------------------
主线程 每次都是从消息队列里面取出消息来处理 并不管他们来自哪里 它视所有属于他的消息都一样 个人觉得 WM_MYMSG 可以共用  楼主可以小试一下效果啊
------解决方案--------------------
窗口跟串口没什么关系,共用一个自然木问题,不过PostMessage的时候要注意参数的生存期
------解决方案--------------------
既然发送消息给窗口,那共用一个窗体句柄,一个消息,无所谓啦. 
PS:头像是你嘛,好漂亮呀
------解决方案--------------------
窗口句柄可以跨线程操作,不过如果是新建子窗口,在新线程也必须写上消息循环