gpt4 book ai didi

c# - 跨线程事件接收器

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:56 24 4
gpt4 key购买 nike

对于我的项目,我使用 C# UI 和 C++ DLL 的组合作为“worker”。我的应用程序使用 Irrlicht 引擎进行渲染。我的 C# 窗口中的面板用作场景的容器。

目前我正在为鼠标交互实现一个事件接收器。我的问题,C++ 代码不接收事件。

我解决了核心问题:我使用 rende 循环是必要的,C++ 代码有机会捕捉事件。对于这个循环,我必须使用线程,否则我的 C# 窗口会被卡住。现在的问题是,事件没有发送到我的接收器,因为事件来自另一个线程。

Irrlicht 系统消息处理程序

if (msg.hwnd == HWnd)  //My issue msg.hwnd = Main Thread HWnd = Render Thread
{
WndProc(HWnd, msg.message, msg.wParam, msg.lParam); //On this way my event receiver would get the event.
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

现在我必须找到一个解决方案,如何从主线程连续渲染和转发事件到渲染线程。

我目前的解决方法是肮脏的方式:

C#代码

while (!RenderStop) //bool to stop this loop
{
MyDll.RenderScene(); // Calculate and redraw changes
Application.DoEvents();
}

这不是什么好方法,但我得到了一个虚假的并行性并且事件到达了我的 DLL。

Ps.所有事件都只是简单的 MouseMove 或 Click 事件。

最佳答案

我会尝试做如下:

  1. 在您的 worker 中定义负责处理事件的其他方法,例如:HandleMouseEvent
  2. 在单独的线程中运行 worker。
  3. 在主 UI 线程中订阅鼠标事件。
  4. 当引发新事件时调用 MyDll.HandleMouseEvent

我不知道 RenderScene 实际上做了什么。但是,请注意 HandleMouseEventRenderScene 方法将在不同的线程中调用。这意味着您可能需要同步访问您的 worker (MyDll) 使用的数据结构。

另一种解决方案可能是为 Irrlicht 引擎使用一些 .NET 包装器,而不是自己编写。例如,我找到了 Irrlicht Lime .但是,我必须承认我没有使用它。

关于c# - 跨线程事件接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35009242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com