Синхронизация потоков между C# и C++
У меня есть приложение C# WPF, которое должно вызывать неуправляемую C++ DLL и получать от нее простое уведомление о событии. DLL будет ожидать появления события клавиатуры, которое невозможно увидеть в.NET (VK_MEDIA_PLAY_PAUSE, пока приложение не имеет фокуса ввода), и уведомляет основное приложение. Я нашел пример использования семафоров для межпроцессной синхронизации, но это кажется излишним. Аналогично, использование именованных каналов, COM, сокетов или p/invoke кажется более чем необходимым.
В частности, я буду запускать работающий поток в приложении WPF, который будет ожидать сигнала о событии клавиатуры, а затем уведомлять основной поток пользовательского интерфейса, чтобы он что-то сделал, как только он это сделает.
Заранее спасибо.
1 ответ
Как только я получил указание в направлении именованных событий, решение стало ясным. На стороне C++ CreateEvent создает именованные события. Но на стороне C# 2 типа событий, которые появляются первыми, это AutoResetEvent и ManualResetEvent, которые не принимают имена, а EventWaitHandle -. Как только я нашел этот класс, остальные встали на свои места. В моем проекте событие устанавливается на стороне C++ в ответ на желаемое нажатие клавиши, а сторона C# ожидает событие в потоке BackgroundWorker и воздействует на него, когда оно происходит.