SendMessageCallback的困惑???

kaxiou 2004-05-06 12:01:02
在《windows高级编程指南》中说道SendMessageCallback()在发送后就立即返回。但是我在堵塞测试的时候发现,调用SendMessageCallback
的线程也死掉了,
下面是我的代码
大概就是在用SendMessageCallback发送消息给对话框之前,创建一个Event,设置为无信号,然后在
对话框的消息响应中等待Event变为有信号才继续执行,根据书上所说,SendMessageCallback()在发送会就返回,
那么发送消息的线程就应该不会因为对话框在处理消息时候因为等待Event而给堵塞住,这样发送线程就可以继续执行下面的SetEvent,
这样对话框WaitForSingleObject()得以返回,这样它也可以得以继续执行

void CMainFrame::OnOpendialog()
{
//该函数创建一个无模式对话框

CWorkingDialog* pdlg=new CWorkingDialog;
ASSERT_VALID(pdlg);
//Create the modeless dialog . represents this dialog.
BOOL bResult = pdlg->Create(IDD_DIALOG1);

CString strMsg="From MainFrame";
HANDLE hEvent=CreateEvent(NULL,TRUE,FALSE,"wait");//创建事件通知 ,手动,无信号

SendMessageCallback(pdlg->GetSafeHwnd(),WM_MSG,(WPARAM)(LPCTSTR)strMsg,0,FunCallback,0);

strMsg="Yes";
SetEvent(hEvent);
}

//响应wm_msg
void CWorkingDialog::OnTestMsg(WPARAM wParam ,LPARAM lParam)
{
HANDLE hEvent = CreateEvent(NULL,TRUE,FALSE,"wait");
ASSERT(GetLastError()==ERROR_ALREADY_EXISTS);
CString str((LPCTSTR)wParam);

WaitForSingleObject(hEvent,INFINITE);//等到有信号才执行下面的代码

MessageBox(str);
}

但是这段代码运行结果跟我上面的猜想不一致,是不是我对SendMessageCallback的“发送就返回”理解错误?
还请指点。谢谢
...全文
644 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lianglp 2004-05-08
  • 打赏
  • 举报
回复
对于SendMessageCallback()函数,
如果发送到当前线程中,则直接调用窗口过程,发送到其它线程中
则立即返回。
kaxiou 2004-05-08
  • 打赏
  • 举报
回复
放到前面我知道是可以,但是我是想测试一下SendMessageCallback的“发送就返回”的特点,就是说我人为把响应消息的函数设置为堵塞,按照书上所说的,SendMessageCallback应该也可以返回,这样发送消息的线程不会给堵塞住。但是实际上不行啊
kaxiou 2004-05-08
  • 打赏
  • 举报
回复
哦,原来如此,多谢指点
kaxiou 2004-05-08
  • 打赏
  • 举报
回复
哦,原来如此,多谢指点
lianglp 2004-05-06
  • 打赏
  • 举报
回复
SetEvent(hEvent);
放到
SendMessageCallback()
函数前就行了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧