Привет, спасибо за ваш ответ, да, я понимаю, что мой вопрос не очень ясен и несколько запутан; так что я попытаюсь немного прояснить ситуацию, здесь идет ..
Все темы, описанные ниже, являются производными от TThread.
У меня есть форма, которая запускает поток, но не ждет его. Поток, запущенный формой, вызывает функцию, которая выполняет длинную задачу.
Функция вызывает другую функцию в DLL, функция в DLL запускает поток и ожидает его. Поток, запущенный функцией DLL, вызывает другую функцию через синхронизацию.
Form-> Запуск потока, но не ожидание-> Поток вызывает функцию-> Функция вызывает функцию DLL-> Функция Dll запускает поток и ожидает-> Поток, запущенный функцией DLL, вызывает другую функцию через синхронизацию, т.е. синхронизацию (UpdateRecords).
Проблема в том, что вызов синхронизации никогда не возвращается, потому что, насколько я вижу, он вошел в какую-то мертвую блокировку.
Как работает синхронизация: Synchronize помещает вызов метода в очередь и устанавливает событие, а Synchronize ждет, пока событие не станет сигнальным. Когда основной поток простаивает, он обрабатывает вызовы методов, ожидающие в очереди, после обработки вызова метода он сообщит о соответствующем событии, чтобы поток, инициировавший синхронизацию, мог продолжить работу.
Поток, который был запущен формой, не использует синхронизацию для вызова функции, выполняющей длинную задачу, если он использует синхронизацию, то приложение не блокирует блокировку, но это противоречит цели использования потока для длинной процесс.
Я разыскал проблему, похоже, что объект TApplication, созданный dll, не обрабатывает сообщения и имеет дескриптор 0, как это произошло, я не знаю (я не писал DLL , он был написан кем-то другим), но это является причиной проблемы, потому что он никогда не обработает метод, вызванный в очереди, синхронизацией.
Ранее я упоминал, что если я вызываю функцию, которая выполняет длинный процесс из моего потока, используя синхронизацию, то приложение не блокирует блокировку. Это связано с тем, что основной поток будет отвечать за вызов функции, которая выполняет длинный процесс. Таким образом, длинная функция процесса вызывает функцию DLL, которая запускает другой поток, а затем вызывает WaitFor. WaitFor проверяет, является ли текущий поток основным потоком, и если это так, он обрабатывает вызовы методов, которые были поставлены в очередь синхронизацией, непрерывно в цикле, пока поток, ожидающий потока, не будет освобожден (т. Е. Метод в очередь через синхронизацию вызывается, и событие ожидания сигнализируется).
В WaitFor, если текущий поток не является основным потоком, WaitFor просто блокирует, пока поток, который он ожидает, не будет освобожден.
В любом случае, я ничего не могу сделать с объектом приложения в dll, потому что этот dll довольно сложен и используется большей системой. Я предполагаю, что могу выставить метод в dll, который может обрабатывать методы в очереди синхронизации, затем я могу вызвать этот метод из моего приложения, пока оно не используется.
В любом случае еще раз спасибо за вашу помощь, но я решил эту проблему сейчас.