Mal*_*lik 4 c++ mfc multithreading sendmessage thread-safety
我有一个大约 20 秒后结束的操作。为了避免冻结,我想创建一个线程并每秒更新其中的标签文本。我查了很多,因为每个人都有不同的意见,我无法决定使用哪种方法。
我试过 SendMessage 并且它有效,但有些人认为使用 SendMessage 不安全,我应该改用 PostMessage。但 PostMessage 失败ERROR_MESSAGE_SYNC_ONLY
(1159)。
char text[20] = "test text";
SendMessage(label_hwnd, WM_SETTEXT, NULL, text);
Run Code Online (Sandbox Code Playgroud)
我搜索了这个,我认为这是因为在 PostMessage 中使用了不允许的指针。这就是它失败的原因。
所以我该怎么做?我糊涂了。你有什么建议?此方法是否适用于更改其他线程中的 UI 元素?
谢谢
的文档ERROR_MESSAGE_SYNC_ONLY
说:
该消息只能用于同步操作。
这意味着您可以使用同步消息传递,即SendMessage
和类似的,但不能使用异步消息传递,即PostMessage
。
原因是它WM_SETTEXT
的参数包含引用的消息。不能按值复制参数。如果您可以WM_SETTEXT
异步传递,那么系统将如何保证接收者窗口收到的指针仍然有效?
因此,系统只会拒绝您发送此消息的尝试,以及任何其他具有引用参数的消息。
你用SendMessage
在这里是合理的。那肯定会奏效。
但是,您正在强制您的工作线程在 UI 上阻塞。UI 可能需要一些时间来更新标题的文本。另一种方法是向 UI 线程发布一条自定义消息,指示 UI 线程更新 UI。然后您的工作线程线程可以继续其任务并让 UI 线程并行更新,而不会阻塞工作线程。
为了使其工作,您需要一种让 UI 线程从工作线程获取进度信息的方法。如果进度像百分比一样简单,那么您需要做的就是让工作线程写入共享变量并让 UI 线程读取共享变量。