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

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

вопрос про корректную остановку потока [D7, XP]


vegarulez ©   (2009-01-13 13:44:00) 

Добрый день мастерам.
Вопрос такого характера.
есть дочерний поток и основной. вопрос заключается в том, что при выключении программы допустим нужно закрывать дочерний поток, в дочерним потоке происходит обращение к БД и отправка данных в инет, спомощью 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;

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


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

> vegarulez ©   (13.01.09 13:44)

См. [5].

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

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


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


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


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


Slym   (2009-01-14 10:43:00) [3]

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

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


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


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


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

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

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


Slym   (2009-01-14 09:56:00) [5]

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;


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

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

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


Slym   (2009-01-14 08:04:00) [7]

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


Slym   (2009-01-14 08:03:00) [8]

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

CoInitialize?


vegarulez   (2009-01-14 08:01:00) [9]

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


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

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

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

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


clickmaker   (2009-01-13 14:02:00) [11]

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

какую?


Наверх

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