![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вопрос про корректную остановку потока [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]> такая реализация вываливает ошибку
какую?