Окно WinForms, созданное в рабочем потоке, не получает все ожидаемые сообщения - PullRequest
0 голосов
/ 24 апреля 2009

Я воспроизводлю аудио в C #, используя функции waveOut с методом обратного вызова, когда сообщения отправляются обратно в дескриптор окна. Я создаю форму Windows с функцией overidden WndProc для прослушивания сообщений MM_WOM_DONE.

result = WaveInterop.waveOutOpen(out hWaveOut, devNumber, waveStream.WaveFormat, waveOutWindow.Handle, 0, WaveInterop.CallbackWindow);

Все это работает полностью надежно, когда я нахожусь в главном потоке GUI моего приложения. Но если фоновый поток пытается сделать это, waveOutWindow никогда не получает ни одного из сообщений WOM_. Сначала я подумал, что, возможно, окно не было создано должным образом, и его очередь сообщений не обслуживалась, но даже если я добавлю следующий код до waveOutOpen, он все равно не будет работать.

waveOutWindow.Show();
Debug.Assert(waveOutWindow.IsHandleCreated, "Handle not created!");
Debug.Assert(waveOutWindow.Created, "Window not created!");

Я должен сказать, что вызов waveOutOpen успешен, как и начальные вызовы waveOutWrite, но я никогда не получаю свои обратные вызовы, чтобы узнать, когда ставить в очередь больше звука.

Я что-то упускаю из форм в фоновых потоках?

Ответы [ 3 ]

1 голос
/ 24 апреля 2009

Вы качаете сообщения в своей вторичной теме?

0 голосов
/ 27 апреля 2009

Хорошо, я понял это сейчас, и, конечно, это было очевидно. Насос сообщения для окна не работает. То, что сбило меня с толку, заключается в том, что при вызове waveOutOpen запускается WndProc для окна и обрабатываются различные сообщения, такие как WM_CREATE, WM_ACTIVATE и т. Д. Однако функция WndProc не продолжает работать после выхода из waveOutOpen (естественно, потому что этот поток выполняет другой код).

0 голосов
/ 24 апреля 2009

Вы должны контролировать ввод сообщений через WinSpector . Вы не знаете, как в аудио-библиотеке реализована обработка сообщений - возможно, она отправляется в основную процедуру окна приложения. Может быть, вы даже можете создать его другим способом, чтобы подать hwnd окна, которое должно получать уведомления.

В любом случае, если какое-либо сообщение отправлено, вы увидите его в WinSpector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...