【问题标题】:Cross Thread event receiver跨线程事件接收器
【发布时间】:2016-05-02 17:52:22
【问题描述】:

对于我的项目,我将 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 事件。

【问题讨论】:

    标签: c# c++ multithreading events dll


    【解决方案1】:

    我会尝试如下:

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

    我不知道RenderScene 究竟做了什么。但是,请注意HandleMouseEvent 和RenderScene 方法将在不同的线程中调用。这意味着您可能需要同步对您的工作人员 (MyDll) 使用的数据结构的访问。

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

    【讨论】:

    • 感谢您的建议。遗憾的是,Irrlicht Lime 的开发在几年前就停止了,而我们的 C++ 已经非常庞大并用于 iOS 项目。对于这个项目,使用 Irrlicht Lime 是无可替代的。我正在研究对数据结构的同步访问。我还向我的问题和一些 cmets 添加了更多代码。
    • 好的,我按照你的方式来。我的渲染循环进入单独的线程,我的主 UI 直接调用 DLL Handle 事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多