Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Вниз

Остановка и запуск потока нити   Найти похожие ветки 

 
Timego   (2003-12-17 12:35) [0]

Уважаемые мастера,
здесь уже довольно много было сказано о правильной работе с потоками (нитями) и проктологичности методов TThread.Suspend и Resume, однако я вновь спрошу об этом.

Так выходит, что код уже написан и в этой стадии разработки возможности изменить его нет.
Есть класс TasServerTalkerThread = class(TThread),
который работает примерно так:
если есть задания на обработку, то перебираем их в цикле, если нету, то останавливаемся:

// Основной цикл работы потока
procedure TasServerTalkerThread.Execute;
var
AShouldWork: Boolean;
begin
try
AShouldWork := True;

while not Terminated and FServerTalker.Active do
begin

if not FServerTalker.FConnector.Connected then
begin
FServerTalker.Log("Невозможно соединиться с сервером", "");
Suspend; //
end
else
begin
try
FIsWorking := True;
try
AShouldWork := FServerTalker.DoWork;
except
on E: Exception do
begin
FServerTalker.Log(E.Message, "", LOG_FatalError);
AShouldWork := False;
end;
end;
finally
FIsWorking := False;
end;

if not AShouldWork then
begin
FServerTalker.FConnector.Disconnect;
Suspend;
end;
end;
end; // of while

finally
CoUninitialize;
end;
end; // end of procedure

поток этот запускается
1) либо по таймеру через определенные интервалы времени
2) либо вручную (Start = Resume, Stop = Suspend)

Так вот: после нескольких перезапусков вручную поток вываливается с фатальной ошибкой "Invalid thread handle".
Из-за чего это может быть и как это можно побороть?


 
Digitman   (2003-12-17 12:42) [1]


> код уже написан и в этой стадии разработки возможности изменить
> его нет


> как это можно побороть


непонятно, как ты собираешься "побороть", если "возможности изменить его нет"


 
Семен Сорокин   (2003-12-17 12:44) [2]

поток этот запускается
1) либо по таймеру через определенные интервалы времени

как запускается? создается новый экземпляр?


 
Timego   (2003-12-17 13:21) [3]


> Digitman © (17.12.03 12:42) [1]
> непонятно, как ты собираешься "побороть", если "возможности
> изменить его нет"


Да, коряво я написал. Целиком переработать подход - обрабатывать потоком переданные ему события и т.п. - пока не могу. Пока хочу понять из-за чего баг, а на следующем этапе (недели через две) переделаю. Пока надеюсь, что я что-то важное упустил и существующий код можно заставить работать без бага.


> Семен Сорокин © (17.12.03 12:44) [2]
как запускается? создается новый экземпляр?


Нет, делается Resume


 
Digitman   (2003-12-17 13:28) [4]


> Timego


> поток вываливается с фатальной ошибкой "Invalid thread handle".


не верю.

если что-то и "вываливается", то уж никак не ДАННЫЙ поток, а тот поток, который в какой-то момент времени обратился к уже несуществующему описателю (хэндлу) данного потока


 
Семен Сорокин   (2003-12-17 13:45) [5]

while not Terminated and FServerTalker.Active do
у тебя же цикл по условию FServerTalker.Active, а внутри ты выставляешь его в false соответственно - выход из цикла, и никакой Resume уже не поможет.


 
Timego   (2003-12-17 13:47) [6]


> не верю.
>
> если что-то и "вываливается", то уж никак не ДАННЫЙ поток,
> а тот поток, который в какой-то момент времени обратился
> к уже несуществующему описателю (хэндлу) данного потока


Хорошо, согласен. Но почему хэндл моего потока (в котором идет обработка) перестает существовать? Если не делать поочередные Suspend/Resume, то хэндл никуда не девается и только после неоднакратных повтоорений Suspend/Resume происходит сия неприятность.


 
Семен Сорокин   (2003-12-17 13:53) [7]

Но почему хэндл моего потока (в котором идет обработка) перестает существовать?
Скорее всего поток завершает работу\выходит из цикла (см. [5])


 
Digitman   (2003-12-17 14:03) [8]


> Но почему


почему-почему) ... почем мне знать, "почему" !

нужно видеть весь код перед глазами

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

только тогда можно будет что-то сказать тебе вразумительное на эту тему

или ты предлагаешь за тебя отладкой твоего кода заняться ?)

p.s.
и заимей на будущее полезную привычку : тело Execute-метода заключать в try..eсxept



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
3-99504
Denisiy
2003-12-04 12:30
2003.12.30
Странная вещь в работе с таблицей через TTable.... не понимаю...


1-99621
WondeRu
2003-12-17 09:09
2003.12.30
problem with TOpenDialog


3-99478
rumrunner
2003-12-04 22:00
2003.12.30
ADO briefcase model ne rabotaet s master/detail?


14-99738
Unregistered
2003-12-08 03:35
2003.12.30
Что это было и где искать вчерашние дискуссии ?


8-99653
Zheks
2003-08-28 22:13
2003.12.30
Canvas





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский