Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1231671849
Ruzzz
2009-01-11 14:04
2009.02.22
поддержка плагинов в программе


3-1214728468
Kolan
2008-06-29 12:34
2009.02.22
Как правильно сохранить в базу массив Double?


15-1230063945
newacct
2008-12-23 23:25
2009.02.22
гбит, кбит, сек


2-1231636459
demon
2009-01-11 04:14
2009.02.22
Окно на поверхности


2-1231487437
321
2009-01-09 10:50
2009.02.22
abstracts methods





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский