Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TThread + OnException [D7, XP]


Страницы:   1 2

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]

Т.е. тебе не интересно почему произошел сбой ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо