Форум: "Основная";
Текущий архив: 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