我总是听说我应该只从 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/