#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 используется для обработки и отрисовки, но декодер — наш собственный. Есть предложения о том, как поддерживать синхронизацию губ?