0

我正在调试一个(主要是)非托管代​​码之上的 Winforms UI 应用程序。有一点 UI 代码不是 WinForms:它使用 DirectX 直接绘制到某些 Panel 组件的表面上。为此,组件的窗口句柄在创建后被记录,任何后续调用需要执行此 DirectX 显示的模块所需的句柄(例如 GetWindowRect()),都使用此句柄。这种机制已经存在了一段时间,没有看到我要描述的问题,尽管也许我们只是幸运。我不再可以使用执行此操作的程序员。

我要解决的问题是,该区域的显示会间歇性地损坏。从后台线程调用此例程。我在我的应用程序日志中看到,例如,对 GetWindowRect() 的调用会突然并伴随绘图问题返回垃圾坐标。Window 句柄本身没有损坏,我有理由确定我们没有覆盖 Windows 数据结构;我可以停止并重新启动我们的显示流,GetWindowsRect() 将使用相同的 Windows 句柄再次开始返回良好的坐标。

如果这是在 .NET 级别,我会使用 Invoke 将绘图推迟到主线程。我的问题是,我们应该对这个 DirectX 调用做同样的事情吗?我试图找到微软关于不要在后台线程中绘制的警告,以提醒自己它是否扩展到使用 Windows 句柄;谁能指出我这一点?

个人电脑

4

1 回答 1

0

窗口句柄具有线程亲和性

最重要的用户界面元素当然是窗口。窗口对象具有线程亲和性。创建窗口的线程是与窗口密不可分的线程。非正式地,有人说线程“拥有”窗口。消息仅在拥有它的线程上发送到窗口过程,一般来说,对窗口的修改只能从拥有它的线程进行。尽管窗口管理器允许任何线程访问诸如窗口属性、样式和其他属性(如窗口过程)之类的东西,并且从窗口管理器的角度来看,此类访问是线程安全的,但通常应该限制加载-修改-写入序列到所有者线程。

于 2009-04-07T21:10:57.007 回答