![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TThread + OnException [D7, XP]
Darvin © (2008-10-17 10:36:00)Здравствуйте!
Есть приложение, состоящее из формы и дополнительного потока 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 12:54:00) [1]
> Исключения потока не показываются
Они и не показываюся, для этого , разумется, нужно предпринять определенные телодвижения, которые, как видно из примера в статье, принципиально ничем не отличаются от телодвижений в Application.HandleException
Leonid Troyanovsky (2008-10-17 12:48:00) [2]
> Leonid Troyanovsky © (17.10.08 12:42) [20]
> Исключения потока не показываются
Хотя, конечно, борланды перестарались.
Лучше бы необработанные исключения гасили процесс,
как и задумывалось MS.
--
Regards, LVT.
Leonid Troyanovsky (2008-10-17 12:42:00) [3]
> Сергей М. © (17.10.08 12:28) [18]
> А какая разница ?
Исключения потока не показываются, бо кто может знать логику,
известную лишь создателю потока.
А в статье приведен именно пример возможной логики.
--
Regards, LVT.
Darvin (2008-10-17 12:39:00) [4]Я прислал всю реализацию кода. Проект из двух модулей
Сергей М. (2008-10-17 12:28:00) [5]
> Leonid Troyanovsky © (17.10.08 12:15) [17]
>
>
А какая разница ?
Тоже самое фактически делается в TApplication.HandleException
> Darvin (17.10.08 12:13) [16]
хм ..
OnTerminate у тебя точно в основном потоке возбуждается ?
С виртуальным DoTerminate ничего не мудрил ?
Leonid Troyanovsky (2008-10-17 12:15:00) [6]
> Darvin (17.10.08 10:36)
http://dn.codegear.com/article/10452
--
Regards, LVT.
Darvin (2008-10-17 12:13:00) [7]нет
Сергей М. (2008-10-17 12:08:00) [8]Т.е. брейкпойнт в теле этого обработчика ты не ловишь ?
Darvin (2008-10-17 12:05:00) [9]procedure TForm1.ApplicationEventsException(Sender: TObject; E: Exception);
begin
ShowMessage ( E.Message );
end;
Сергей М. (2008-10-17 12:00:00) [10]
> не обрабатывается ApplicationEventsException
А как выглядит обработчик ?
Darvin (2008-10-17 11:48:00) [11]то, что нужно, текст исключения
Сергей М. (2008-10-17 11:46:00) [12]И что в этот момент отладчик говорит насчет Exception(FatalException).Message ?
Darvin (2008-10-17 11:45:00) [13]да
Сергей М. (2008-10-17 11:44:00) [14]на строке с raise брейкпойнт ловишь ?
Darvin (2008-10-17 11:29:00) [15]Модуль формы:
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:23:00) [16]Должно "срабатывать".
Показывай код ..
Darvin (2008-10-17 11:20:00) [17]А почему после raise не срабатывает Application.OnException?
Сергей М. (2008-10-17 10:57:00) [18]Ну тогда самое простое решение - в обработчике Thread.OnTerminate проанализировать св-во Thread.FatalException, и если оно <> nil, то тут же возбудить исключение:
raise Exception(Thread.FatalException)
Darvin (2008-10-17 10:51:00) [19]вот именно, что интересно
Сергей М. (2008-10-17 10:47:00) [20]Т.е. тебе не интересно почему произошел сбой ?