Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.013 c
9-1175880657
GLProg
2007-04-06 21:30
2008.11.30
Ошибка в GL программе


2-1224477221
Fynjy
2008-10-20 08:33
2008.11.30
путь к файлу в разделе HKEY_CURRENT_USER software printer name


15-1222511662
Игорь Шевченко
2008-09-27 14:34
2008.11.30
Предлагается звукотехника


3-1210606073
Вася
2008-05-12 19:27
2008.11.30
Firebird и список БД


15-1222177235
@!!ex
2008-09-23 17:40
2008.11.30
Помогите с lua кодом.