Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Kolan ©   (2007-01-04 13:02:00) 

Есть доп поток. Вот его метод 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).


Kolan   (2007-01-06 19:03:00) [1]

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


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

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

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


Kolan   (2007-01-04 23:50:00) [3]

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


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


Eraser   (2007-01-04 22:01:00) [4]

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

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

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

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


Kolan   (2007-01-04 19:48:00) [5]

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

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

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

Угу понял…


Джо   (2007-01-04 16:47:00) [6]

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

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


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

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


oxffff   (2007-01-04 14:27:00) [8]

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


Eraser   (2007-01-04 14:18:00) [9]

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


Eraser   (2007-01-04 14:18:00) [10]

> в главном?

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


Kolan   (2007-01-04 14:13:00) [11]

> begin
> raise FException;
> end;

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


tesseract   (2007-01-04 13:50:00) [12]


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


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


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

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

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


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

Зачем?


tesseract   (2007-01-04 13:17:00) [14]


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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо