Главная страница
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.008 c
9-1176916840
ElectriC
2007-04-18 21:20
2009.02.22
Проблема с камерой


2-1231601420
Lukos
2009-01-10 18:30
2009.02.22
Что предпочтительнее Table1.Append или Table1.Insert ?


15-1230210505
Правильный$Вася
2008-12-25 16:08
2009.02.22
фигня какая-то с форумом


4-1205435861
Guest312
2008-03-13 22:17
2009.02.22
Ole перехват?


2-1231835371
Кирил
2009-01-13 11:29
2009.02.22
Как узнать - сколько дней в месяце?