![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как можно из главного потока завершить другой поток ?
Juice © (2005-07-20 23:07:00)Как можно из главного потока завершить другой поток ?
Потоковая функция такая:
TMyThread.Execute;
begin
DataSet.Open;
end;
Пробовал:
TerminateThread( MyThread.handle, 0); - зависание
MyThread.Terminate - аналогично
MyThread.Free - тоже виснет
Juice (2005-07-21 18:29:00) [1]Тема закрыта
Juice (2005-07-21 17:56:00) [2]
> принудительное же снятие трэда (в контексте которого выполняется
> такой запрос) с выполнения при пом. TerminateThread() есть
> потенциальный источник утечек ресурсов.
Да я так и думал и уже хотел хвататься за переписывание потока на чистом АПИ, да лень было, решил спросить :)
> по поводу корректного снятия длительных IB-запросов с выполнения
> (c участием ХП) на ibase.ru есть статья с примерами
Перерыл весь сайт, ничего не нахожу. Буду очень признателен за намек где искать. В нете тоже ничего нет. Такое впечатление что это вообще никогда и никем не использовалсь, а ведь тема очень актуальная для серьезных приложений, ИМХО.
Digitman (2005-07-21 11:42:00) [3]
> Open делает запрос к ХП (выполняется около минуты)
по поводу корректного снятия длительных IB-запросов с выполнения (c участием ХП) на ibase.ru есть статья с примерами.
принудительное же снятие трэда (в контексте которого выполняется такой запрос) с выполнения при пом. TerminateThread() есть потенциальный источник утечек ресурсов.
Juice (2005-07-21 09:59:00) [4]
> Все верно. Причина в Open. Какая СУБД?
Interbase. Open делает запрос к ХП (выполняется около минуты)
evvcom (2005-07-21 08:26:00) [5]Все верно. Причина в Open. Какая СУБД?
Германн (2005-07-21 02:11:00) [6]Имхо, сей топик лучше перенести в Базы! Поскольку в большинстве случаев некий
DataSet.Open;
вызывает драйвер баз данных. А уж как он там работает?
И, тогда, при чем тут некие потоки?
juice (2005-07-21 00:57:00) [7]
> Terminate только свойство Terminated устанавливает, которое
> ты и должен проверять в Execute
Возможности что-то проверять нет никакой, почему я и код потоковой функции привел.
> Когда ты закрываешь главное окно, твой поток продолжает
> работать, а именно, метод Open
После TerminateThread мой поток не должен продолжать работать.
kull (2005-07-20 23:24:00) [8]Насколько я понимаю.
Когда ты закрываешь главное окно, твой поток продолжает работать, а именно, метод Open. Поэтому программа и виснет. А Terminate только свойство Terminated устанавливает, которое ты и должен проверять в Execute. Надо разбираться с Open, почему он так долго работает.
А насчет изменения реализации - это шютка. :)
Juice (2005-07-20 23:19:00) [9]
> Тут тебе может помочь только изменение реализации DataSet.Open
Не верю :)
Juice (2005-07-20 23:18:00) [10]Сори, забыл уточнить:
При использовании TerminateThread( MyThread.handle, 0) и MyThread.Terminate зависание происходит не сразу - сначала вроде все выглядит ок, программа виснет после попытки закрыть главное окно (после нажима на сист. кнопку 'х').
MyThread.Free - виснет сразу.
> Тут тебе может помочь только изменение реализации DataSet.Open
???
kull (2005-07-20 23:11:00) [11]Тут тебе может помочь только изменение реализации DataSet.Open