交叉线程事件接收器

时间:2016-01-26 08:04:24

标签: c# c++ multithreading events dll

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

目前,我正在实施用于鼠标交互的事件接收器。我的问题,C ++代码没有收到事件。

我解决了核心问题:我必须使用rende循环,C ++代码有机会捕获事件。对于这个循环,我必须使用一个Thread,否则我的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 个答案:

答案 0 :(得分:1)

我会尝试按如下方式进行:

  1. 在您的工作人员中定义负责处理事件的其他方法,例如:HandleMouseEvent
  2. 在单独的线程中运行worker。
  3. 在主UI线程中订阅鼠标事件。
  4. 举起新活动时,请致电MyDll.HandleMouseEvent
  5. 我不知道RenderScene实际上做了什么。但请注意,HandleMouseEventRenderScene方法将在不同的线程中调用。这意味着您可能需要同步访问工作者使用的数据结构(MyDll)。

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