Как отобразить в основном окне из вторичного потока для видеопроигрывателя

#c# #c #user-interface #directx

#c# #c #пользовательский интерфейс #directx

Вопрос:

Я создаю приложение для видеоплеера с пользовательским интерфейсом на C # и декодированием и отображением видео (DirectX) на C .

Код C компилируется как DLL и взаимодействует с пользовательским интерфейсом C #.

Для поддержания правильной частоты кадров отображения мне нужно создать вторичный поток либо в C DLL, либо в C #, который может выполнять точную синхронизацию и вызывать функцию отображения через правильные промежутки времени.

Однако создание вторичного потока, сообщения которого отображаются в окне, созданном основным потоком (из C # GUI), создает нарушение доступа и приводит к сбою.

Однако, если я использую объект timer в C # для отображения, проигрыватель работает, но я не могу поддерживать правильную частоту кадров из-за его грубой детализации.

Что было бы хорошим решением для решения этой проблемы?

Ответ №1:

Я думаю, что сбои, с которыми вы сталкиваетесь, вызваны тем фактом, что вы не можете получить доступ к элементам управления Windows Forms извне основного потока.

Рассмотрите возможность использования элемента управления.Вызовите(), чтобы вызвать выполнение, которое вам нужно в основном потоке.

Однако имейте в виду, что для передачи запроса Control.Invoke() используется очередь сообщений Windows, поэтому ожидайте некоторых неточностей.

Комментарии:

1. Однако, управление. Invoke отправляет обратный вызов в очередь сообщений. Таким образом, ваше время не будет точным на 100% — то есть вызов не будет выполнен в это время, но, возможно, на несколько мс позже, в зависимости от того, есть ли в очереди сообщений сообщения с более высоким приоритетом. Это может вызвать проблемы с синхронизацией губ.

2. Есть ли какая-либо причина, по которой вам нужно представлять каждый кадр самостоятельно и не позволять DirectX делать это за вас?

3. DirectX используется для обработки и отрисовки, но декодер — наш собственный. Есть предложения о том, как поддерживать синхронизацию губ?