Многопоточное приложение Delphi (TThread) не завершится

Я использовал Обработчик Копий. Самая хорошая вещь об этом состоит в том, что это стоит в очереди свои задания как менеджер загрузок. Это имеет расширение оболочки, таким образом, можно или щелкнуть правой кнопкой, перетаскивают, или просто устанавливают копию с copyhandler как действие по умолчанию.

6
задан Jeedee 23 November 2009 в 17:00
поделиться

3 ответа

Вы должны иметь возможность отменить запрос ADO, подключив событие OnFetchProgress и установив для переменной Eventstatus значение esCancel. Это должно привести к завершению вашего запроса и позволить потоку корректно закрываться, не прибегая к использованию TerminateThread.

8
ответ дан 8 December 2019 в 12:20
поделиться

Как вы можете прочитать в msdn, использование TerminateThread опасно.

TerminateThread - опасный функция, которую следует использовать только в самые крайние случаи. Вам следует вызывайте TerminateThread, только если знаете что именно целевой поток делаете, и вы контролируете весь код что целевой поток может быть запущенным во время завершение.

Но он также очень эффективен в уничтожении потоков. Вы уверены, что правы в своих выводах? Может быть, поток убит, но другой поток все еще работает? Может у вас ручки не резьбовые? Не могли бы вы показать нам код? Или даже лучше: небольшой рабочий пример, который мы могли бы попробовать сами?

5
ответ дан 8 December 2019 в 12:20
поделиться

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;
6
ответ дан 8 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: