![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Иключения в потоке. Как правильно обрабатывать?
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) в цикл добавь.