2016-01-26 2 views
2

Для моего проекта я использую комбинацию 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.

ответ

1

Я хотел бы попробовать сделать следующее:

  1. Определить дополнительный метод в вашем работника, который будет отвечать за обработку событий, например: HandleMouseEvent.
  2. Запуск работника в отдельной теме.
  3. Подписывать события мыши в основной теме пользовательского интерфейса.
  4. Когда возникает новое событие, звоните MyDll.HandleMouseEvent.

Я не знаю, что RenderScene на самом деле. Однако обратите внимание, что методы HandleMouseEvent и RenderScene будут вызываться в разных потоках. Это означает, что вам может потребоваться синхронизация доступа к структурам данных, используемым вашим рабочим (MyDll).

Другим решением может быть использование какой-либо .NET-оболочки для Irrlicht Engine вместо написания ее самостоятельно. Например, я нашел Irrlicht Lime. Однако я должен признать, что я не использовал его.

+0

Спасибо за ваши предложения. К сожалению, развитие Irrlicht Lime остановилось много лет назад, и наш C++ уже огромный и используется в проекте iOS. Использование Irrlicht Lime не является альтернативой этому проекту. Я смотрю на синхронизацию доступа к структуре данных. Также я добавил больше кода к моему Вопросу и некоторым комментариям. –

+0

Хорошо, я пойду твоим путем. Моя Render Loop попадает в отдельный поток, и мой основной пользовательский интерфейс вызывает событие DLL Handle напрямую. –

Смежные вопросы