PostMessage возвращает “недопустимый дескриптор окна” в потоке

Фон: Я использую OmniThreadLibrary для загрузки пакетного режима хранимые процедуры ADO в фоновом режиме. Я делаю некоторый немного изворотливый материал путем свопинга соединения после открытия SP, но это, кажется, довольно надежно. Я использую PostMessage для передачи сообщений обратно форме вызова, и это работает в моих тестовых приложениях. Primoz' comms каналы работают на меня, я использую каналы для межпотока comms, но для нашего главного приложения я стараюсь избегать той зависимости при помощи стандартных вызовов PostMessage, как мы делаем в другом месте в приложении.

Проблема: К сожалению, когда я поместил это в наше главное приложение, вызовы PostMessage в потоке начинают перестать работать с 1400:invalid дескриптор окна.

Я подробно добавил дополнительные вызовы PostMessage и регистрирующий код, чтобы попытаться определить местоположение проблемы, но я вне идей теперь. Код является шаблоном:

const WM_PW_ADLQUEUEEMPTY = WM_USER + 11;
...
if PostMessage (OwnerHandle, WM_PW_ADLPROGRESS, QueueID, 10) then
    pwDebugLog ('TADLQueue.Run WM_PW_ADLPROGRESS send to  ' + IntToHex (OwnerHandle, 8) + ' (IsWindow '+BoolToStr(IsWindow(OwnerHandle),true)+')     OK for Queue ' + IntToStr (QueueID))
else
    pwDebugLog ('TADLQueue.Run WM_PW_ADLPROGRESS send to  ' + IntToHex (OwnerHandle, 8) + ' (IsWindow '+BoolToStr(IsWindow(OwnerHandle),true)+') failed for Queue ' + IntToStr (QueueID));

Но журнал для серии вызовов не является очень разоблачающим мне. обратите внимание, что четыре шестнадцатеричных цифры после времени являются идентификатором потока от GetCurrentThreadID.

15:41:53.221 1614  TpwAsyncDataLoader.RunQueue WM_PW_ADLPROGRESS send to  00A5110C (IsWindow True)    OK for Queue -6
15:41:53.265 13B4  TADLQueue.Run WM_PW_ADLPROGRESS send to  00A5110C (IsWindow True)     OK for Queue -6
15:41:53.554 13B4  TADLQueueManager.WriteSysErrorMessageToDatabase Postmessage   00A5110C (IsWindow False)  failed with 1400  Invalid window handle

Кто-либо может пролить некоторый свет на это? Я смущен в том, как дескриптор окна может стать недопустимым, в то время как я смотрю на него, но это - то, на что он похож мне.

Одна вещь, о которой я могу думать, состоит в том, что форма, которую я показываю здесь, не обрабатывает сообщения, и я вижу "очередь сообщений полный" отказ, а не IsWindow (дескриптор) отказ, на который это похоже. Как я могу протестировать на это?

6
задан 13 August 2010 в 05:50
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: