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

Вниз

Thread and Exception   Найти похожие ветки 

 
AlexNx   (2004-01-22 11:57) [0]

Народ! Почему если в новом классе наследованом Thread возникает ошибка, то она не райзится.В частности делаю Indy SMTP Client

SMTP.Connected := True;
в обычном приложении если не верно указан хост, то вылетает ошибка, а в Thread классе - ничего... При дебаге вылазит, а в работающем виде нет.


 
jack128 ©   (2004-01-22 12:02) [1]

см модуль SConnect procedure TTransportThread.Execute; там показано, как переправить исключение в основной поток, а там уж с ним чего хошь делай.


 
Digitman ©   (2004-01-22 12:05) [2]


> в новом классе ..возникает ошибка


абсурд.

исключение возбуждается не в классе (каким бы он ни был), а ходе исполнения одного из его методов в контексте конкретного кодового потока

все прекрасно "райзится" ... "ловить" просто исключения ты не умеешь, видимо ..

try
SMTP.Connected := True;
except
on e: exception do
messagebox(0, PChar(e.Classname + " " + e.message), "Программное исключение", mb_ok or mb_setforeground);
end;


 
AlexNx   (2004-01-22 12:10) [3]

>Digitman
Так вот и ничего подобного!
Аналогичный код НЕ РАБОТАЕТ!!!
При дебаге все ОК, а в реальном приложении если ошибка повторяется, то да, она райзится. Только потом когда закрываешь приложение возникает новое исключение, типа Invalid window handle...


 
Digitman ©   (2004-01-22 12:16) [4]


> Аналогичный код НЕ РАБОТАЕТ!!!


приводи дословно свой "аналогичный код"
еще лучше - полный текст метода Execute


> При дебаге все ОК


что означает ОК ? попадаешь на строчку on e:Exception ? или что ?


 
AlexNx   (2004-01-22 12:21) [5]

>Digitman
on E: Exception do
begin
Result := False;
MessageDlg(sCannotConnectToSMTPServer, mtWarning, [mbOK], 0);
raise;
end


 
Erik ©   (2004-01-22 12:26) [6]

Ха-ха-ха ничего себе аналогичный!!! А может мы наведем курсрр на MessageDlg и нажмем F1? Советую посмотреть в кокой help попадем. Врядли это будет win32. :) Неплохо бы знать в чем состоит понятие ThreadSafe(потоко безопасный код).


 
Digitman ©   (2004-01-22 12:27) [7]

ну и где же "аналогичный код" ?
я же сказал тебе - MessageBox() !! Что отсебячину-то пишешь ?

во-вторых, я просил привести полный текст метода Execute


 
AlexNx   (2004-01-22 12:27) [8]

УПС!!!
Мои извинения Digitman!!!
Если выводить ошибку через MessageBox, то все ОК...
А в чем дело? Если не сложно объясни...


 
Digitman ©   (2004-01-22 12:28) [9]

MessageDlg(sCannotConnectToSMTPServer, mtWarning, [mbOK], 0);
raise; //еще одна "отсебячина" !


 
Digitman ©   (2004-01-22 12:32) [10]


> Если не сложно объясни


в 2-х словах :

MessageDlg() создает VCL-объект-форму и визуализирует ее в мод.режиме ... VCL-форма - не потокобезопасный VCL-объект и требует синхронизации обращений к его св-вам/методам с осн.код.потоком

MessageBox() же - это чисто WinAPI-ф-ция, вызов ее в доп.код.потоке без синхронизации с основным код.потоком практически всегда безопасен


 
AlexNx   (2004-01-22 12:33) [11]

ок. весь текст той процедуры, где происходит ошибка

function TEMailSender.DoAdditionalProcedure: boolean;
begin
FProgressForm.Caption := Format(FormCaption,
[round(FProgressBar.Position / FProgressBar.Max * 100)]);
PrepareEMail;
Result := True;
try
FSMTP.Connect();
except
on E: Exception do
begin
Result := False;
ErrorCaption := sCannotConnectToSMTPServer;
MessageBox(0, PChar(sCannotConnectToSMTPServer), "Программное исключение",
MB_OK OR MB_SETFOREGROUND OR MB_ICONERROR);
raise;
Может я чего не понимаю, но ведь код то дальше пойдет выполняться. А это не нужно!
end
end;
try
try
FSMTP.Send(FMailMessage);
except
on E: Exception do
begin
Result := False;
ErrorCaption := Format(sCannotSendEMail, [E.Message]);
MessageBox(0, PChar(ErrorCaption), "Программное исключение", mb_OK OR MB_SETFOREGROUND);
raise;
MessageDlg
end
end;
finally
FSMTP.Disconnect;
end;
end;


 
AlexNx   (2004-01-22 12:34) [12]

>Digitman
Спасибо. Все понял...


 
Digitman ©   (2004-01-22 12:41) [13]


> FProgressForm.Caption :=


еще одна твоя грубая ошибка - обращение к VCL-объекту без синхронизации


> raise;
> Может я чего не понимаю, но ведь код то дальше пойдет выполняться.
> А это не нужно!


ну так и пиши Exit ! почему raise-то ?

непреложное правило таково : программные исключения, потенциально ожидаемые в ходе выполнения Execute() НИ в коем случае НЕ должны "выпускаться" тобой за пределы контекста этого метода... т.е. все что творится в Execute, д.б. заключено во внешнеокаймляющий блок перехвата/обработки ЛЮБЫХ исключений, которые могут возникнуть :

try
.. // здесь у тебя все что угодно может твориться
except
// но здесь никаких raise не допустимы !
end;


 
AlexNx   (2004-01-22 12:53) [14]

Профан в многопоточных приложениях... Учусь.
А где про многопоточные почитать-то?


 
Erik ©   (2004-01-22 13:17) [15]

Лучше Рихтера ничего нет, но примеры на С++. К томуже там много про OS написано. Основное тебе сказали тред взвимодействует с остальным кодом подругому!


 
Андрей Сенченко ©   (2004-01-22 13:19) [16]

[13]
относится не только к многопоточности. Ко всему в принципе.



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

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

Наверх




Память: 0.5 MB
Время: 0.02 c
8-16541
Дмитрий
2003-10-05 17:41
2004.02.06
TrackBar В TMediaPlayer


1-16310
Volodya_
2004-01-25 12:55
2004.02.06
Popup menu


1-16305
SeS
2004-01-23 18:15
2004.02.06
Забор значений из файла


11-16209
BaRToV
2003-05-19 01:33
2004.02.06
Applet.AttachProc(xxx)


4-16831
vitalmoya
2003-11-27 20:46
2004.02.06
список окон приложения