Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.22;
Скачать: CL | DM;

Вниз

вопрос про корректную остановку потока   Найти похожие ветки 

 
vegarulez ©   (2009-01-13 13:44) [0]

Добрый день мастерам.
Вопрос такого характера.
есть дочерний поток и основной. вопрос заключается в том, что при выключении программы допустим нужно закрывать дочерний поток, в дочерним потоке происходит обращение к БД и отправка данных в инет, спомощью idHttp. Т.е. в дочернем потоке нужно корректно закрывать соединение с БД. делаю в основном потоке вот так
в обработчике onClose формы

Form1.Thread_Send_BD.Terminate;

в дочернем в методе Execute

begin
try
 // дальше запуск процедуры соединения с инетом и отправки данных
...
 except
...
 end;

if Terminated then
begin
 myzconection.Disconnect;
 myzquery.Free;
 myzconection.Free;
 myHTTP.Free;
end;

Вопрос, как сделать правильно? Потому как такая реализация вываливает ошибку, т.к. в моменте запрос с БД, происходит передача данных и т.п.


 
clickmaker ©   (2009-01-13 14:02) [1]

> такая реализация вываливает ошибку

какую?


 
Медвежонок Пятачок ©   (2009-01-13 14:12) [2]

Потому как такая реализация вываливает ошибку, т.к. в моменте запрос с БД, происходит передача данных и т.п.

такого не может быть.
пока работают синхронные методы датасета, никакой другой код из приведенного тобой не получает управления.

пс: я бы лучше сначала квери гасил, а потом уже убивал коннекшен к бд


 
vegarulez ©   (2009-01-14 08:01) [3]

немного не то хотел сказать, всмысле не вываливает ошибку, а не гасит конектион к БД. то есть обращаясь к access он создаёт файл *.ldb при убиении всех коннектов файл удаляется, при не убиении - остаётся на диске, т.е. коннект закрыт некорректно.


 
Slym ©   (2009-01-14 08:03) [4]

vegarulez ©   (14.01.09 8:01) [3]
некорректно

CoInitialize?


 
Slym ©   (2009-01-14 08:04) [5]

Slym ©   (14.01.09 8:03) [4]
+ конекшен где создан? в потоке или "на форме"


 
vegarulez ©   (2009-01-14 08:21) [6]

Slym ©   (14.01.09 08:04) [5]
в потоке. методе execute.

а "рубится" поток terminate`ом при закрытии основной формы.


 
Slym ©   (2009-01-14 09:56) [7]

vegarulez ©   (13.01.09 13:44)
if Terminated then
begin
myzconection.Disconnect;
myzquery.Free;
myzconection.Free;
myHTTP.Free;
end;

непонятная конструкция...
procedure Execute
begin
 try
   CoInitialize
   conection.create
   query.create
   HTTP.create
   try
     while not terminated do
     begin
       <<<--------WORKаем
     end;
   finally
     conection.free
     query.free
     HTTP.free
     CoUninitialize
   end;
 except
   WriteLog;
 end;
end;


 
Сергей М. ©   (2009-01-14 10:18) [8]


> "рубится" поток terminate`ом


Поток не "рубится terminate`ом"

Terminate всего лишь взводит флаг FTerminate.

Твой осн.поток взвел этот флаг и преспокойно (!), почему-то не дожидаясь фактического завершения доп.потока, завершает работу.
А надо бы дождаться.
На то у доп.потока есть метод WaitFor.


 
Slym ©   (2009-01-14 10:43) [9]

Сергей М. ©   (14.01.09 10:18) [8]
завершает работу

если только halt и ему подобное... иначе должен висеть в процессах пока все потоки не умрут


 
Сергей М. ©   (2009-01-14 10:58) [10]


> Slym ©   (14.01.09 10:43) [9]


Это да.
Но дело не в том, что процесс жив пока жив хотя бы один его поток.
Дело в потенциально возможной рассинхронизации прикладной логики.


 
Юрий Зотов ©   (2009-01-14 13:49) [11]

> vegarulez ©   (13.01.09 13:44)

См. [5].

В обработчике onClose формы:

Form1.Thread_Send_BD.Terminate; // Взводим флаг завершения потока
Form1.Thread_Send_BD.WaitFor; // Ждем реального завершения потока



Страницы: 1 вся ветка

Текущий архив: 2009.02.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
2-1231438760
NEWichok
2009-01-08 21:19
2009.02.22
Как организовать проверку перед "POST"?


15-1230055660
TUser
2008-12-23 21:07
2009.02.22
О теории кайфа


15-1229611134
Добежал
2008-12-18 17:38
2009.02.22
На что заменить критические секции в Vista?


2-1231673189
Pavel
2009-01-11 14:26
2009.02.22
Выполнение SQL-скрипта в Delphi


15-1230191626
Virgo_Style
2008-12-25 10:53
2009.02.22
Новогодняя раздача слонов от Returnil Virtual System