如何SendMessage()到在另一个线程上创建的窗口
How do I SendMessage() to a window created on another thread?
我有一种情况,我想要SendMessage
到一个窗口,该窗口是在另一个线程上创建的,而不是调用SendMessage
的线程。
默认行为似乎是永远阻塞而不工作。
因此我将调用更改为PostMessage
,这不会阻塞发送线程,但消息似乎从未到达预期的窗口。
那么我如何SendMessage
到一个单独的线程上创建的窗口,还是这是不可能的?
PostThreadMessage函数向指定线程的消息队列发送消息。您可以指定要将消息发布到的线程的标识符。这是你想要的吗?
拥有目标窗口的线程在做什么?它需要发送消息,以便能够接收发送或发布给它的消息。这通常是通过GetMessage/TranslateMessage/DispatchMessage循环来完成的。如果线程正在做其他事情-例如阻塞等待事件或互斥锁或IO完成,或者在其他循环中忙于执行计算,则不会接收消息:发送到线程的SendMessage将阻塞,并且PostMessage将发送但不会被传递。
如果目标线程需要管理事件或类似的事情,并且它也拥有一个窗口,您可能需要在该线程的消息循环中使用MsgWaitForMultipleObjects
您正在进入死锁。例如,如果你将SendMessage
发送给另一个线程,那么该线程中的windowProc将SendMessage
返回给你的窗口,它们将永远锁等待对方。
您需要修复PostMessage
(它确实传递消息,只是在您的代码中的某个地方有错误),或者非常小心谁调用谁以及何时。
为了防止线程繁忙或挂起,有SendMessageTimeout
.
您创建的每个控件都属于创建它的线程,这意味着该控件的WndProc将在创建该控件的线程中运行。您可以使用SendMessage和PostMessage自由地向任何控件发送消息
CWnd::PostMessage和CWnd::SendMessage的问题是相同的。消息被推送出去,没有被任何东西接收。SendMessage被设计为阻塞;它的工作是阻塞线程,直到消息被接收。
MSDN表示SendMessage:
" SendMessage函数调用指定的窗口过程窗体,并且在窗体过程被处理之前不会返回该消息。"
可以使用CWnd::PostThreadMessage或winapi PostMessage向另一个线程上的窗口发送消息。当你创建窗口时,你可以使用GetSafeHwnd()来获取句柄,也可以在创建线程时使用线程ID。
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- C++ 线程创建/删除与线程停止/恢复
- Qt - 如何从线程创建 QFuture
- 我可以使用Qt线程ID为每个线程创建唯一的缓存吗?
- 零MQ 后台线程创建
- OpenMP 线程创建
- GLFW & ImGui:从 main 以外的线程创建 ImGui 控件
- 对象:无法为位于不同线程中的父线程创建子级
- C++ 11:线程创建给我一个"Attempt to use a deleted function"错误
- C 的周期性线程创建
- MPI - 当数组初始化值必须为常量时,如何为工作线程创建部分数组
- 当主GUI线程被阻塞时,如何从工作线程创建无模式对话框
- 多个线程创建5个线程来计算质数
- 为线程创建模板
- 线程创建,CRT和DLL是如何完成的?
- 同步线程创建和销毁(静态)对象
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理
- 从不同线程创建QMainWindow
- QFuture 无法为位于不同线程中的父线程创建子级
- ( QNativeSocketEngine)QObject:无法为位于不同线程中的父线程创建子级