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

Вниз

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

Наверх





Память: 0.48 MB
Время: 0.04 c
4-16834
vitalmoya
2003-12-01 23:03
2004.02.06
Название, класа по идентификатору


7-16770
Fidgety
2003-11-22 10:15
2004.02.06
Как эмитировать клик мыхой?


14-16685
Blender
2004-01-17 13:15
2004.02.06
Internet Explorer


1-16467
HolyMan
2004-01-27 22:37
2004.02.06
Как сделать цветной грид через строчку?


3-16047
Andrey V.
2004-01-13 08:08
2004.02.06
ПЛАН :-)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский