Фон: Я использую OmniThreadLibrary для загрузки хранимых процедур ADO в пакетном режиме в фоновом режиме. Я делаю немного хитроумные вещи, меняя соединение после открытия SP, но это кажется довольно надежным. Я использую PostMessage для отправки сообщений обратно в форму вызова, и это работает в моих тестовых приложениях. Каналы связи Primoz работают для меня, я использую их для связи между потоками, но для нашего основного приложения я пытаюсь избежать этой зависимости, используя стандартные вызовы PostMessage, как мы делаем в других местах приложения.
Проблема: К сожалению, когда я помещаю это в наше основное приложение, вызовы PostMessage в потоке начинают давать сбой с 1400: недопустимый дескриптор окна.
Я добавил дополнительные вызовы 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 (дескриптор), как он выглядит. Как я могу проверить это?