Я использовал Обработчик Копий. Самая хорошая вещь об этом состоит в том, что это стоит в очереди свои задания как менеджер загрузок. Это имеет расширение оболочки, таким образом, можно или щелкнуть правой кнопкой, перетаскивают, или просто устанавливают копию с copyhandler как действие по умолчанию.
Вы должны иметь возможность отменить запрос ADO, подключив событие OnFetchProgress и установив для переменной Eventstatus значение esCancel. Это должно привести к завершению вашего запроса и позволить потоку корректно закрываться, не прибегая к использованию TerminateThread.
Как вы можете прочитать в msdn, использование TerminateThread опасно.
TerminateThread - опасный функция, которую следует использовать только в самые крайние случаи. Вам следует вызывайте TerminateThread, только если знаете что именно целевой поток делаете, и вы контролируете весь код что целевой поток может быть запущенным во время завершение.
Но он также очень эффективен в уничтожении потоков. Вы уверены, что правы в своих выводах? Может быть, поток убит, но другой поток все еще работает? Может у вас ручки не резьбовые? Не могли бы вы показать нам код? Или даже лучше: небольшой рабочий пример, который мы могли бы попробовать сами?
Instead of using threads with TADOQuery, maybe you should consider using the async options of ADO.
ADOQuery1.ExecuteOptions := [eoAsyncExecute, eoAsyncFetch, eoAsyncFetch];
Then when your application close, you can call :
ADOQuery1.cancel;