Фон: Я использую 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 (дескриптор) отказ, на который это похоже. Как я могу протестировать на это?