Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.053 c
6-1087211397
Ivan K
2004-06-14 15:09
2004.08.22
Recv и синхронный режим


1-1091522755
П7
2004-08-03 12:45
2004.08.22
Расширенные возможности INI файлов


4-1089283866
andrey__
2004-07-08 14:51
2004.08.22
Как принять сообщение в TServiceApplication посланное другим прил


3-1091105940
Dysan
2004-07-29 16:59
2004.08.22
ADOQuery и DataSource - "Missing Connection or ConnectionString"


1-1092125540
Mitrofan
2004-08-10 12:12
2004.08.22
Конфигуратор для приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский