Здравствуйте, Leonid Troyanovsky, Вы писали:
LT> Конечно, дополнительная информация не мешает.
LT> Даже сам термин "событие" неоднозначен.
Ситуация следующая:
В динамически подгружаемой библиотеке выполняются операции через TADOConnection.Execute(...).
ConnectionString для операции передается извне, и сам объект-соединение создается уже в библиотеке.
Событию OnExecuteComplete назначается метод объекта, созданного в этой же библиотеке.
При выполнении такого кода все происходит обычно: выполнил-событие о завершении-обработчик-следующая строка кода.
Connection.Execute(Script, cmdText, Sync) // Sync=[], выполнение обычное, без изысков
Если выполнять этот метод в асинхронном режиме
Connection.Execute(Script, cmdText, Sync) // Sync=[eoAsyncExecute], выполняем асинхронно
OnExecFinished.WaitFor(INFINITE); // OnExecFinished : TEvent
Событие OnExecFinished устанавливается (TEvent.SetEvent) в обработчике события TADOConnection.OnExecuteComplete.
Если выполнять этот код с объектом Connection, созданном в контексте главного потока (при инициализации библиотеки), то события возникают и обрабатываются, как я и хочу.
Если Connection создан в контексте вторичного потока, то событие возникает, но не обрабатывается.
Это, на самом деле, наверное, нормально

.
При такой работе, в поток, в котором создано подключение, приходят некие сообщения, которых он не получает, если выполняются операции в Conection, созданном в главном потоке.
Очевидно, что сообщения о происшедших событиях объект отсылает создавшему его потоку.
В главном потоке эти сообщения корректно обрабатываются.
В моем же вторичном потоке я их никак не обрабатываю, просто потому что не знаю, как по пришедшему сообщению выяснить для какого объекта возникло событие.
При этом не совсем ясно, почему проблема возникает только при асинхронном выполнении операции в Execute.