Для моего проекта я использую комбинацию C# UI и C++ DLL как «рабочий». В моем приложении используется Irrlicht Engine для рендеринга. Панель в моем окне C# используется в качестве контейнера для сцены.Ресивер для передачи речевого потока
В настоящее время я реализую приемник событий для взаимодействия с мышью. Моя проблема, код C++ не принимает события.
Я разработал основную проблему: необходимо, чтобы я использовал цикл rende, чтобы код C++ имел возможность поймать событие. Для этого цикла я должен использовать Thread, иначе мое окно C# замерзает. Теперь проблема, события не отправляются на мой приемник, потому что события происходят из другого потока.
Irrlicht Системные сообщения Handler
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);
}
Теперь я должен нашел решение, как я могу contiously визуализации и пересылки событий из главного потока, чтобы сделать тему.
Моей текущая работа вокруг грязный путь:
C# Код
while (!RenderStop) //bool to stop this loop
{
MyDll.RenderScene(); // Calculate and redraw changes
Application.DoEvents();
}
Это не хороший способ, но с этим я получаю поддельный параллелизм и события reachs моего DLL.
Ps. Все события - это просто события MouseMove или Click.
Спасибо за ваши предложения. К сожалению, развитие Irrlicht Lime остановилось много лет назад, и наш C++ уже огромный и используется в проекте iOS. Использование Irrlicht Lime не является альтернативой этому проекту. Я смотрю на синхронизацию доступа к структуре данных. Также я добавил больше кода к моему Вопросу и некоторым комментариям. –
Хорошо, я пойду твоим путем. Моя Render Loop попадает в отдельный поток, и мой основной пользовательский интерфейс вызывает событие DLL Handle напрямую. –