对于我的项目,我使用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事件。
答案 0 :(得分:1)
我会尝试按如下方式进行:
HandleMouseEvent
。MyDll.HandleMouseEvent
。我不知道RenderScene
实际上做了什么。但请注意,HandleMouseEvent
和RenderScene
方法将在不同的线程中调用。这意味着您可能需要同步访问工作者使用的数据结构(MyDll)。
另一个解决方案可能是为Irrlicht Engine使用一些.NET包装器而不是自己编写它。例如,我找到了Irrlicht Lime。但是,我必须承认我没有使用它。