Форум: "Начинающим";
Текущий архив: 2009.02.22;
Скачать: [xml.tar.bz2];
Внизвопрос про корректную остановку потока Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c