Текущий архив: 2008.11.30;
Скачать: CL | DM;
Вниз
TThread + OnException Найти похожие ветки
← →
Darvin (2008-10-17 10:36) [0]Здравствуйте!
Есть приложение, состоящее из формы и дополнительного потока TThread. В приложении обрабатывается OnException:
procedure TForm1.ApplicationEventsException(Sender: TObject; E: Exception);
begin
ShowMessage ( E.Message );
end;
Код потока:
procedure TChange.Execute;
begin
repeat
Synchronize(Send);
Write(5);
until Terminated;
end;
procedure TChange.Send;
begin
Form1.Label1.Caption := IntToStr(StrToInt(Form1.Label1.Caption) + 1);
end;
Так вот Write(5) в потоке не вызывает обращение к OnException, а подвешивает поток. Как сделать так, стобы при исключениях в потоке срабатывало Application.OnException?
← →
Сергей М. © (2008-10-17 10:40) [1]
> Write(5) в потоке не вызывает обращение к OnException
И не должно.
> подвешивает поток
Нет, не подвешивает. Происходит исключительная ситуация, и поток завершает работу.
> Как сделать так, стобы при исключениях в потоке срабатывало
> Application.OnException?
А смысл какой в этом ?
← →
Darvin (2008-10-17 10:44) [2]залогировать сбой.
← →
Сергей М. © (2008-10-17 10:47) [3]Т.е. тебе не интересно почему произошел сбой ?
← →
Darvin (2008-10-17 10:51) [4]вот именно, что интересно
← →
Сергей М. © (2008-10-17 10:57) [5]Ну тогда самое простое решение - в обработчике Thread.OnTerminate проанализировать св-во Thread.FatalException, и если оно <> nil, то тут же возбудить исключение:
raise Exception(Thread.FatalException)
← →
Darvin (2008-10-17 11:20) [6]А почему после raise не срабатывает Application.OnException?
← →
Сергей М. © (2008-10-17 11:23) [7]Должно "срабатывать".
Показывай код ..
← →
Darvin (2008-10-17 11:29) [8]Модуль формы:
procedure TForm1.Button1Click(Sender: TObject);
begin
FChange := TChange.Create(false);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if FChange <> nil then
FreeAndNil ( FChange );
end;
procedure TForm1.ApplicationEventsException(Sender: TObject; E: Exception);
begin
ShowMessage ( E.Message );
end;
Модуль потока:
procedure TChange.Execute;
begin
repeat
Synchronize(Send);
Write(5);
until Terminated;
end;
procedure TChange.Send;
begin
Form1.Label1.Caption := IntToStr(StrToInt(Form1.Label1.Caption) + 1);
end;
constructor TChange.Create(CreateSuspended: Boolean);
begin
inherited Create ( CreateSuspended );
OnTerminate := ChangeTerminate;
end;
procedure TChange.ChangeTerminate(Sender: TObject);
begin
if FatalException <> nil then
raise Exception(FatalException);
end;
Исключение возникает, но не обрабатывается ApplicationEventsException, и при этом завершается программа.
← →
Сергей М. © (2008-10-17 11:44) [9]на строке с raise брейкпойнт ловишь ?
← →
Darvin (2008-10-17 11:45) [10]да
← →
Сергей М. © (2008-10-17 11:46) [11]И что в этот момент отладчик говорит насчет Exception(FatalException).Message ?
← →
Darvin (2008-10-17 11:48) [12]то, что нужно, текст исключения
← →
Сергей М. © (2008-10-17 12:00) [13]
> не обрабатывается ApplicationEventsException
А как выглядит обработчик ?
← →
Darvin (2008-10-17 12:05) [14]procedure TForm1.ApplicationEventsException(Sender: TObject; E: Exception);
begin
ShowMessage ( E.Message );
end;
← →
Сергей М. © (2008-10-17 12:08) [15]Т.е. брейкпойнт в теле этого обработчика ты не ловишь ?
← →
Darvin (2008-10-17 12:13) [16]нет
← →
Leonid Troyanovsky © (2008-10-17 12:15) [17]
> Darvin (17.10.08 10:36)
http://dn.codegear.com/article/10452
--
Regards, LVT.
← →
Сергей М. © (2008-10-17 12:28) [18]
> Leonid Troyanovsky © (17.10.08 12:15) [17]
>
>
А какая разница ?
Тоже самое фактически делается в TApplication.HandleException
> Darvin (17.10.08 12:13) [16]
хм ..
OnTerminate у тебя точно в основном потоке возбуждается ?
С виртуальным DoTerminate ничего не мудрил ?
← →
Darvin (2008-10-17 12:39) [19]Я прислал всю реализацию кода. Проект из двух модулей
← →
Leonid Troyanovsky © (2008-10-17 12:42) [20]
> Сергей М. © (17.10.08 12:28) [18]
> А какая разница ?
Исключения потока не показываются, бо кто может знать логику,
известную лишь создателю потока.
А в статье приведен именно пример возможной логики.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2008-10-17 12:48) [21]
> Leonid Troyanovsky © (17.10.08 12:42) [20]
> Исключения потока не показываются
Хотя, конечно, борланды перестарались.
Лучше бы необработанные исключения гасили процесс,
как и задумывалось MS.
--
Regards, LVT.
← →
Сергей М. © (2008-10-17 12:54) [22]
> Исключения потока не показываются
Они и не показываюся, для этого , разумется, нужно предпринять определенные телодвижения, которые, как видно из примера в статье, принципиально ничем не отличаются от телодвижений в Application.HandleException
Страницы: 1 вся ветка
Текущий архив: 2008.11.30;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.017 c