Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

raise в потоке   Найти похожие ветки 

 
TUser ©   (2004-08-10 13:31) [0]

Если raise вызываем в потоке, то окно с сообщением об ошибке не появляется, а просто завершается выполнение потока, выполняется OnTerminate. А можно ли сделать так, чтобы показать нормальное окно с сообщением об ошибке. Можно, конечно, сделать так

try
... raise ...
except
  FTemp:="Error message";
  Synchronize (Er);
  raise Exception.Create(""); // terminating thread
end;

procedure TMyThread.Er;
begin
  ShowMessage(FTemp+#13"Thread terminated");
end;

Как это сделать правильно?


 
inic ©   (2004-08-10 13:36) [1]

Попробуй так:

try
... raise ...
except
 FTemp:="Error message";
 Synchronize (Er);
end;

procedure TMyThread.Er;
begin
 raise Exception.Create(FTemp); // terminating threadend;
end;


 
TUser ©   (2004-08-10 13:39) [2]

Хм. Хочу вообще избежать "re-raising" и try...except. Т.е. так - если вызывался raise, то окошко - и поток завершается.


 
inic ©   (2004-08-10 13:55) [3]

А что если все оставить как у тебя, только убрать из except..end
строку "raise Exception.Create(""); //..."


 
y-soft ©   (2004-08-10 14:03) [4]


try
 while not Terminated do
   //raise MyException.Create("Test");
except
 On E:Exception do
 begin
   E.Message := Format("Ошибка в потоке обработки:"#13#10#13#10" %s",[E.Message]);
   Application.ShowException(E);
   //или Application.HandleException(E);
 end;
end;


 
Skyle ©   (2004-08-10 14:07) [5]

Я тут сейчас покопался в коде (Delphi5) и нарыл следующее.
В конструкторе TThread вызывается функция BeginThread, в которую передаётся в параметре ThreadFunc адрес функции Classes.ThreadProc. Назначение ThreadProc - вызвать метод Execute нужного TThread. В функции BeginThread вызывается функция создания апишного Thread CreateThread, которой в качестве параметра ThreadFunc передаётся не тот Classes.ThreadProc, а некоторая System.ThreadWrapper.
Адрес функции Classes.ThreadProc содержится как параметр записи, передаваемой API функции в 4-м параметре.
Функция SysUtils.ThreadWrapper вызывает эту самую Classes.ThreadFunc и в случае чего гасит исключения (потому что складывает в стек адрес функции System._ExceptionHandler, которая не оставляет от исключения ничего.
Следовательно, либо исключение ловиться в Execute, либо не ловиться нигде.

В общих чертах я понял так.
С удовольствием приму поправки.


 
Skyle ©   (2004-08-10 14:10) [6]


> Функция SysUtils.ThreadWrapper

Пардон, конечно System.ThreadWrapper...


 
y-soft ©   (2004-08-10 17:16) [7]

Вот офицальный ответ Borland по subj:

http://community.borland.com/article/0,1410,10452,00.html

И некторые отличия для D6 и старше:

http://bdn.borland.com/article/0,1410,27655,00.html


 
Бином Ньютоныч   (2004-08-10 17:53) [8]

>Skyle ©   (10.08.04 14:07) [5]

Остается только добавить, что это поведение полностью соответствует идеалогии Windows в данном вопросе:)


 
jack128 ©   (2004-08-10 17:58) [9]

Глянь как сделано в SConnect.TTransportThread.Execute



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.054 c
9-1083671803
alless
2004-05-04 15:56
2004.08.22
Sprite & Button


14-1091602881
parovoZZ
2004-08-04 11:01
2004.08.22
Самый лучший


14-1091283695
СатирЪ
2004-07-31 18:21
2004.08.22
Пересечение символьных множеств.


3-1091281147
Wolfram
2004-07-31 17:39
2004.08.22
Какие сложности могут возникнуть при работе с Power Builder 9.0


1-1092108093
Time
2004-08-10 07:21
2004.08.22
Ресурс больше, чем файл...