Главная страница
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.034 c
6-1158428475
kernel
2006-09-16 21:41
2007.02.25
Console&Socket


2-1170429405
dzuev
2007-02-02 18:16
2007.02.25
пишу в lpt-порт а получается абракадабра.


3-1165211588
Yaros-hoi
2006-12-04 08:53
2007.02.25
Подключение к mdb через ADO на удаленной машине


1-1168108827
Sleepeer
2007-01-06 21:40
2007.02.25
Работа с MD и ERT файлами 1Сv77 напрямую - без плагинов в дельфи


2-1170873033
framez
2007-02-07 21:30
2007.02.25
combobox