回调函数 与 主线程 执行顺序疑问

kpszh 2010-01-26 11:17:58
VOID CALLBACK MySendAsyncProc(
HWND hwnd, // handle to destination window
UINT uMsg, // message
DWORD dwData, // application-defined value
)
{
char szWndText[255];
memset(szWndText,0,255);
char *szGameText = (char*)dwData;
int nLen = strlen(szGameText);
GetWindowText(hwnd,szWndText,255);
szWndText[nLen + 1] = 0;
if (lstrcmpi(szGameText,szWndText) == 0)
{
OutputDebugString("Found Hwnd");
}
}

void CTest2Dlg::OnButton3()
{
char *Title = "画板";
::SendMessageCallback(HWND_BROADCAST, WM_PAINT, 0, 0, (SENDASYNCPROC)MySendAsyncProc, (DWORD)Title);
Sleep(2000);//无论这里延时多少
OutputDebugString("Over");
}
注意,无论上面延时多少,总是先输出Over ,然后再输出Found Hwnd,,怎么样办呢?我Sleep(2000)就是想等回调函数被执行,然后再执行OutputDebugString("Over")
...全文
804 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kpszh 2010-01-29
  • 打赏
  • 举报
回复
发错了,应该15楼得分的,不好意思阿。
kpszh 2010-01-27
  • 打赏
  • 举报
回复
结贴:
::SendMessageCallback(HWND_BROADCAST, WM_PAINT, 0, 0, (SENDASYNCPROC)MySendAsyncProc, (DWORD)Title);
不是马上被执行的,需要有WM——PAINT消息才会被激活,当然也可以其它的消息。
oyster2008 2010-01-26
  • 打赏
  • 举报
回复
MSDN原文:
The callback function is only called when the thread that called SendMessageCallback calls GetMessage, PeekMessage, or WaitMessage.
也就是说这个函数只有在你调用GetMessage, PeekMessage, or WaitMessage这些函数的时候才会被带调用。而只有退出OnButton3这些函数才会被调用
yutaooo 2010-01-26
  • 打赏
  • 举报
回复

能够猜测一下吗? 我对windows编程不太熟悉。。。

我估计首先要建立一个新的线程。就说它是个worker thread吧。然后他要有自己的消息处理循环。

能想到的就这些了。

kpszh 2010-01-26
  • 打赏
  • 举报
回复
请问怎么样把回调函数MySendAsyncProc()放到另一个线程呢?
yutaooo 2010-01-26
  • 打赏
  • 举报
回复

看LZ这样的现象,根本不像在两个线程中分别执行 CTest2Dlg::OnButton3() 与 MySendAsyncProc()。

LZ能确定这是在两个线程中跑的?能否print thread id校验一下(做点类似的事情)?

如果能确定,那就要查M$在处理这种情况下的隐含同步了。这不太可能!

我判断,MySendAsyncProc()还是当前线程处理的。
zhou1xp 2010-01-26
  • 打赏
  • 举报
回复
mark
traceless 2010-01-26
  • 打赏
  • 举报
回复
。。。。
kpszh 2010-01-26
  • 打赏
  • 举报
回复
主线程执行完才被执行,,主线程要是做个死循环,那回调函数一直等不到执行。
也就是说,回调函数一定要等主线程完成了才被执行,这不是我想要的。
traceless 2010-01-26
  • 打赏
  • 举报
回复
Faint~~

那到底回调函数被执行没有,前面又说可以执行,后面又说不可以执行。。。

kpszh 2010-01-26
  • 打赏
  • 举报
回复
OutputDebugString("Over"); 不能放到回调。。。大家有什么好方法呢?我试过在回调函数里设置一个标志,然后主线程循环的等,结果,循环好久都还是没有等到回调函数被执行。。。
eyodo8 2010-01-26
  • 打赏
  • 举报
回复
应该是你回调函数中需要使用你dlg的资源的,所以他一定会等待OnButton3操作完成后才会处理的,是系统自己的同步机制。所以你的等待是无效的。
traceless 2010-01-26
  • 打赏
  • 举报
回复
如果你想在回调之后触发其它事件,可设置一个类标志变量,或者使用事件之SetEvent
traceless 2010-01-26
  • 打赏
  • 举报
回复
别这样搞。。。

OutputDebugString("Over"); 还不如放到回调里
kpszh 2010-01-26
  • 打赏
  • 举报
回复
我想先发广播,然后等回调函数被执行,然后主线程继续往后走。。
回调函数不被执行就一直等!
kpszh 2010-01-26
  • 打赏
  • 举报
回复
但是我发了广播后,系统是马上调用我的回调函数的,所以我在那等了2秒。。。可是发现,系统还是在我等完两秒后才去调用我的回调函数。
pengzhixi 2010-01-26
  • 打赏
  • 举报
回复
你永远没办法控制操作系统执行哪个线程。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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