【问题标题】:Ok to use a C# Panel's HWND in a Win32 Dll on another thread?可以在另一个线程的 Win32 Dll 中使用 C# 面板的 HWND 吗?
【发布时间】:2011-11-19 20:55:50
【问题描述】:

我有一些工作,但我不确定它是否正常以及以后是否会导致问题。

我有一个 Win32 C++ 应用程序,它进行一些视频处理并使用 Direct3D 进行显示(不是我的代码)。我的任务是用 C# GUI 替换 GUI。

我已将 C++ 代码制成 dll。 我在 C# 中创建了一个 GUI,并有一个用于视频显示的面板。我将此面板的 HWND 传递给 dll,一切似乎都运行良好。

但是 - 该面板正在被创建它的线程以外的线程访问,这是不应该的。
我的一部分想要“独自离开”,但这感觉不对,我怀疑这会导致问题。比如当我们想在面板上捕捉点击事件时,这将在主线程或 UI 线程上......创建面板。

关于我应该如何做到这一点的任何建议? 谢谢 谢谢

【问题讨论】:

  • 也许让 C++ 代码创建自己的 HWND,它是 Panel 的子级(而不是尝试直接使用 Panel HWND)——然后你可以随意使用它。 (如果面板在其生命周期内改变了大小,您可能需要将 C# 代码 P/Invoke 转换为 C++ 以让它知道它应该适当地调整大小 - 但这很简单,可以跨线程使用 SetWindowPos。)

标签: c# winapi dll direct3d ui-thread


【解决方案1】:

我想你已经知道这个问题的答案了。 Windows 具有线程关联性。窗口上的所有操作都应该从创建它的线程中执行。

鉴于此规则,我无法想象 DLL 负责将窗口访问移动到不同的线程并假设是您的代码执行此操作。解决方案是让您在调用 DLL 的同一线程中创建和访问窗口。

【讨论】:

  • C++ 端有大量数据,用于视频处理——所以我宁愿不把它带到 C# 端。要在 C++ 端执行此操作,是否有等效于 component.InvokeRequired 然后是 Invoke?
【解决方案2】:

我发现这种技术的主要问题是您的 UI 会闪烁。如果您在使用 WPF 的过程中足够早,您可能想看看 D3DImage 如果不是您现在正在做的大部分工作。

【讨论】:

  • 我不会重做已使用多年的视频处理。请注意,它违反了纯 C++ 版本中的“不要从另一个线程访问窗口”规则。那部分留在 DLL 中
猜你喜欢
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2010-10-25
  • 2015-09-22
  • 1970-01-01
相关资源
最近更新 更多