Главная страница
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.069 c
1-1091639532
bloodman
2004-08-04 21:12
2004.08.22
Вызов функции главной программы из dll.


1-1091946029
k-sergey
2004-08-08 10:20
2004.08.22
ListBox1MouseUp как узнать на каком items кликнули ?


14-1091634622
SPE-Line
2004-08-04 19:50
2004.08.22
Иконки для программ


1-1091688309
Kergma
2004-08-05 10:45
2004.08.22
Консольное приложение + события + процедурные типы : бррррррррррр


1-1091533799
П7
2004-08-03 15:49
2004.08.22
Умные плагины в DLL