Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.30;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
7-99793
Floppy
2003-10-24 15:07
2003.12.30
Серийный номер флоппи диска?


14-99765
mur
2003-12-06 16:26
2003.12.30
вывод дерева на экран


1-99590
SiJack
2003-12-17 14:44
2003.12.30
замучился с DBChart


1-99525
Andriy Tysh
2003-12-16 15:39
2003.12.30
Image in QuickReport


1-99593
Tumcoat
2003-12-16 03:03
2003.12.30
Как программно в Word-е добавить таблицу?