Текущий архив: 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]«а зачем вызывать исключение в основном потоке, если оно
произошло в главном?»
Пользователю чтобы сообщение выдать…
«Занести в лог. Если нужно, проинформировать основной поток.
Завершить работу потока. »
Угу понял…
← →
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.48 MB
Время: 0.039 c