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

Вниз

Иключения в потоке. Как правильно обрабатывать?   Найти похожие ветки 

 
Kolan ©   (2007-01-04 13:02) [0]

Есть доп поток. Вот его метод Execute.

procedure TMeasurmentPerformer.Execute;
begin
 inherited;
 FreeOnTerminate := True;
 while not Terminated do
 begin
     FMeasurmentStrategy.StartMeasurment(FMeasurmentRange, FMeasurment);
 end;
end;

В StartMeasurment может возникнуть исключение. Как его обработать?

Я пробовал так:

procedure TMeasurmentPerformer.Execute;
begin
 inherited;
 FreeOnTerminate := True;
 while not Terminated do
 begin
   try
     FMeasurmentStrategy.StartMeasurment(FMeasurmentRange, FMeasurment);
   except
     on E: Exception do
     begin
       FException := E;
       Synchronize(HandleException);
     end;
   end;
   Suspend;
 end;
end;


procedure TMeasurmentPerformer.HandleException;
begin
 raise FException;
end;


Но че-то неправильно. Сообщение об ошибке не появляется. А при повторном запуске получаю Thread error (6).


 
tesseract ©   (2007-01-04 13:17) [1]


> А при повторном запуске получаю Thread error (6).


Поток может всё ещё работает?

И Sleep(1) в цикл добавь.


 
Kolan ©   (2007-01-04 13:20) [2]

> Поток может всё ещё работает?
>

Хотелось бы понять почему я не получаю сообщение об ошибке если она возникает.
- Наверно я неправильно её обработываю.


> И Sleep(1) в цикл добавь.

Зачем?


 
tesseract ©   (2007-01-04 13:50) [3]


> > И Sleep(1) в цикл добавь.Зачем?


Чтобы процессор на 100% не грузить. Проверь пошаговым отладчиком, может у тебя исключение не обрабатываеться.


 
Kolan ©   (2007-01-04 14:13) [4]

> begin
> raise FException;
> end;

Сюда я попадаю. А дальше в отладчике вообше туча ошибок.А без него тишина - никаких сообщений.


 
Eraser ©   (2007-01-04 14:18) [5]

а зачем вызывать исключение в основном потоке, если оно произошло в главном?


 
Eraser ©   (2007-01-04 14:18) [6]

> в главном?

т.е. в дополнительном.


 
oxffff ©   (2007-01-04 14:27) [7]

А Suspend у тебя должен в цикле стоять?


 
MetalFan_pda   (2007-01-04 15:30) [8]

помоему нельзя так экзешны передавать...


 
Джо ©   (2007-01-04 16:47) [9]

> В StartMeasurment может возникнуть исключение. Как его обработать?

Занести в лог. Если нужно, проинформировать основной поток. Завершить работу потока. :)


 
Kolan ©   (2007-01-04 19:48) [10]

«а зачем вызывать исключение в основном потоке, если оно
произошло в главном?»

Пользователю чтобы сообщение выдать&#133

«Занести в лог. Если нужно, проинформировать основной поток.
Завершить работу потока. »

Угу понял&#133


 
Eraser ©   (2007-01-04 22:01) [11]

> [10] Kolan ©   (04.01.07 19:48)
> «а зачем вызывать исключение в основном потоке, если оно
>
> произошло в главном?»
>
> Пользователю чтобы сообщение выдать…

а какой смысл в этой конструкци?

> procedure TMeasurmentPerformer.HandleException;
> begin
> raise FException;
> end;

с таким же успехом можно показать стандартный мессадж-бокс.


 
Kolan ©   (2007-01-04 23:50) [12]

«
с таким же успехом можно показать стандартный мессадж-бокс.»


Лана завтра попробую.


 
oxffff ©   (2007-01-06 13:54) [13]

>Но че-то неправильно. Сообщение об ошибке не появляется.

TApplication.Idle вызывает CheckSynchronize, а в нем
          try
             SyncProc.SyncRec.FMethod;
           except
             SyncProc.SyncRec.FSynchronizeException := AcquireExceptionObject;
           end;


 
Kolan ©   (2007-01-06 19:03) [14]

Совета «[11]» мне хватило, благодарю.



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

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.038 c
2-1170944309
olevacho_
2007-02-08 17:18
2007.02.25
проблемма с типом boolean


3-1165168049
001
2006-12-03 20:47
2007.02.25
Текстовая база


15-1170457040
DillerXX
2007-02-03 01:57
2007.02.25
Подскажите с анимацией.


11-1148567746
GigAl
2006-05-25 18:35
2007.02.25
HTML и KOL


15-1170314724
=Teddy=
2007-02-01 10:25
2007.02.25
Откуда скачать Indy 10 для Delphi 5 !!!