Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как можно из главного потока завершить другой поток ?


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо