从不同线程调用窗口方法安全吗?

问题描述 投票:0回答:1

我知道窗口消息只能在创建该窗口的同一线程中处理。 但是是否可以(甚至安全)创建一个窗口并在一个线程中处理其消息,然后从另一个线程调用类似

ShowWindow()
的内容?

当然,我们还需要注意同步以防止竞争情况。 我尝试通过使用

std::mutex
锁定窗口来做到这一点,但遇到了死锁。 似乎对
ShowWindow()
的调用将向该窗口发送一条消息并阻止执行,直到处理该消息为止。而且由于消息处理过程中发生了另一个锁定,因此死锁是不可避免的。

我的假设是,虽然在技术上没有互斥锁是可行的,但它是不安全的。 那么,调用 ShowWindow() 的唯一

预期
方式是来自创建此窗口的同一线程吗?

c++ winapi
1个回答
0
投票

对于某些 api 来说这是可能的,而对于某些 api 来说则不然。 例如对于

ShowWindow
这是可能的。但在这种具体情况下,最好使用
ShowWindowAsync
,它是专门为设置另一个线程的窗口的显示状态而设计的。

从另一面

DestroyWindow

线程不能使用 DestroyWindow 来销毁由不同线程创建的窗口。

所以需要单独查找每个 api。

当然我们还需要注意同步以防止竞争 条件

当然不是。哪个竞赛条件?如何 ?所有窗口 api 都会将一些消息发布到给定窗口线程的消息队列中。所以它总是在单线程中进行

© www.soinside.com 2019 - 2024. All rights reserved.