c - 从另一个线程操作 GUI 控件有什么问题吗?

标签 c multithreading winapi

我总是听说我应该只从 GUI 线程操作 GUI 控件,但我不明白从另一个线程这样做有什么问题。

我的意思是如果我想改变一个窗口的标题栏文本,我需要做的就是向窗口的消息队列发送一条消息。那么从另一个线程执行此操作有什么问题呢?

最佳答案

HWND 与创建它的线程有关联。只有拥有线程才能销毁 HWND,并且只有拥有线程才能接收通过拥有线程的消息队列发布到 HWND 的消息。如果消息由拥有线程发送直接到 HWND,则立即调用 HWND 的窗口过程,否则通过拥有线程的消息循环分派(dispatch)(不要与拥有线程的消息队列混淆) ).因此无论哪种方式,HWND 的窗口过程总是在拥有线程的上下文中执行。

拥有线程可能还具有与 HWND 相关联的数据,或者使用来自 HWND 的通知来操作其他数据/HWND,这些数据/HWND 不受跨线程并发访问的保护。

因此只有拥有线程才能以任何方式操作 HWND 及其数据。

现在,有一些异常(exception),例如 WM_SETTEXT。但是,除非您确定任何给定消息都是线程安全的,否则请假设它不是线程安全的,并通过拥有的线程委托(delegate)对 HWND 的所有访问。

关于c - 从另一个线程操作 GUI 控件有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29012941/

相关文章:

java - 有没有办法在编译时为Java定义一个常量值

c - 为什么 readline 库中的 readline() 不接受 UNICODE? ANSI C语言

delphi - EnumWindows 在 64 位 Delphi 中行为异常

c# - 如何获取已知文件夹的本地化名称?

C : How to detect if execvp waiting for standard input?

c - 在枚举声明中使用数据类型

java - 使用java中的 volatile boolean 标志从 HashMap 中的另一个线程停止一个线程

linux - iptables 线程安全吗?

c++ - boost::scoped_lock 似乎没有锁定 std::cout

c# - 如何使用 C# 为三个组合键注册热键