我知道窗口消息只能在创建该窗口的同一线程中处理。 但是是否可以(甚至安全)创建一个窗口并在一个线程中处理其消息,然后从另一个线程调用类似
ShowWindow()
的内容?
当然,我们还需要注意同步以防止竞争情况。 我尝试通过使用
std::mutex
锁定窗口来做到这一点,但遇到了死锁。
似乎对 ShowWindow()
的调用将向该窗口发送一条消息并阻止执行,直到处理该消息为止。而且由于消息处理过程中发生了另一个锁定,因此死锁是不可避免的。
我的假设是,虽然在技术上没有互斥锁是可行的,但它是不安全的。
那么,调用 ShowWindow()
的唯一
预期方式是来自创建此窗口的同一线程吗?
对于某些 api 来说这是可能的,而对于某些 api 来说则不然。 例如对于
ShowWindow
这是可能的。但在这种具体情况下,最好使用 ShowWindowAsync
,它是专门为设置另一个线程的窗口的显示状态而设计的。
DestroyWindow
线程不能使用 DestroyWindow 来销毁由不同线程创建的窗口。
所以需要单独查找每个 api。
当然我们还需要注意同步以防止竞争 条件
当然不是。哪个竞赛条件?如何 ?所有窗口 api 都会将一些消息发布到给定窗口线程的消息队列中。所以它总是在单线程中进行