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

Вниз

SmtpCli из пакета ISC меня уже достал!!!   Найти похожие ветки 

 
Прохожий   (2003-08-28 11:06) [0]

Делаю на базе сабжа корпаративный рассылщик. Уже блин с потоками разобрался, а эта хрень всё выпендриваеться. Если выполняю рассылку в модуле Execute - при выполнении Smtp.Connect (начиная со второго потока) получаю исключение. Если делаю рассылку через Synchronize(Send), то почти всё класно, но только тогда убивается сама идея многопоточности. Ведь то, что описано в Send будет выполняться в основном потоке? Короче я в ступоре...:(


 
Прохожий   (2003-08-28 11:27) [1]

Кто нибуль может посоветовать компонент, лишеных таких неприятносей ?


 
Reindeer Moss Eater   (2003-08-28 11:27) [2]

TButton


 
Е-Моё имя   (2003-08-28 11:30) [3]

Reindeer Moss Eater © (28.08.03 11:27)
))))))

Прохожий © (28.08.03 11:06)
какое исключение?


 
Прохожий   (2003-08-28 11:42) [4]

//Reindeer Moss Eater ©
Юморист, блин :))


 
Nikolay M.   (2003-08-28 11:42) [5]

Насколько я понимаю в колбасных обрезках, SMTP-протокол основан на протоколе TCP, т.е. протокол точка-точка. Каким образом ты хочешь соединиться с чужим компьютером по одному протоколу по одному порту более одного раза, я не представляю... Посмотри RFC 821.


 
Anatoly Podgoretsky   (2003-08-28 11:45) [6]

идея многопоточности убивается самим компонентом, ICS это событийные компоненты, потоки не нужны и вредны. Почитай доступную документация. Если хочешь потоки, то переходи на синхронные компоненты.


 
Прохожий   (2003-08-28 11:47) [7]

Ну а как же отправляет, например бат? Одновременно из нескольких ящиков на один SMTP ?


 
Reindeer Moss Eater   (2003-08-28 11:49) [8]

Smtp.Connect
Так зачем тебе вторичные потоки для асинфронных вызовов?


 
Прохожий   (2003-08-28 11:54) [9]

Anatoly Podgoretsky © (28.08.03 11:45) [6]

идея многопоточности убивается самим компонентом, ICS это событийные компоненты, потоки не нужны и вредны. Почитай доступную документация. Если хочешь потоки, то переходи на синхронные компоненты.


А разьве не нельзя для каждого компонента, каждого потока использовать свою процедуру обработки события? Я же их создаю в Run- Time..


 
Reindeer Moss Eater   (2003-08-28 12:00) [10]

В чем смысл использовать потоки у тебя?


 
Прохожий   (2003-08-28 12:09) [11]

Смысл в том, что без использования потоков у меня возникает косяк, о котором я уже писал: http://delphimaster.net/view/14-1060575544/ Поэтому я и решил организовать для каждой серии писем свой поток со своим компонентом SmtpCli


 
Reindeer Moss Eater   (2003-08-28 12:12) [12]

а т.к. отправка занимает некоторое время,
Метод-то асинхронный, какая разница сколько времени занимает отправка, если возврат из метода происходит сразу после вызова?


 
SPeller   (2003-08-28 12:21) [13]

Ну зачем тебе многопоточность? ICS - асинхронные компоненты, поэтому многопоточность создаётся системой. Делай цикл, в котором для каждого письма - отдельный экземпляр SmtpCli, назначай им обработчик завершения отправки письма в котором уничтожай экземпляр. Вот и всё, чего геморроиться?


 
Прохожий   (2003-08-28 12:36) [14]

Делай цикл, в котором для каждого письма - отдельный экземпляр SmtpCli, назначай им обработчик завершения отправки письма в котором уничтожай экземпляр. Вот и всё, чего геморроиться?
Я именно так и сделал


 
Прохожий   (2003-08-28 12:50) [15]

Вот кусок кода:

repeat
RcptName.Clear;
Recipient:="";
for I:=0 to NumOfReceive-1 do begin
Recipient:=Recipient+MailList[index]+",";
RcptName.Add(MailList[index]);
inc(index);
if index=counter then begin break
end;
end;
SmtpRcptName:=RcptName;
SmtpRecipient:= Recipient;

SMTP_Thread.CreateIt( SmtpSubject, SmtpHost, SmtpPort, SmtpUsername,
SmtpPassword, SmtpAuthType, SmtpHdrFrom, SmtpFromName, SmtpHdrSender,
SmtpHdrReturnPath, SmtpFileList, SmtpContentType, SmtpHdrPriority,
SmtpMailMessage, SmtpRecipient,SmtpSendMetod, SmtpRcptName );

until (index=counter);

Поток:

procedure SMTP_Thread.Send;
var i: Integer;
begin
Smtp:=TSmtpCli.Create (nil);

with Smtp do begin
OnRequestDone:=SmtpRequestDone;

Host:=Smtp_Host;

Port:=Smtp_Port;

Username:=Smtp_Username;
Password:=Smtp_Password;
AuthType:=Smtp_AuthType;

HdrFrom:=Smtp_HdrFrom;
FromName:=Smtp_FromName;

HdrSender:=Smtp_HdrSender;
HdrReturnPath:=Smtp_HdrReturnPath;

EmailFiles:=Smtp_FileList;

ContentType:=Smtp_ContentType;

HdrPriority:=Smtp_HdrPriority;

HdrSubject:=Smtp_Subject;

RcptName:=Smtp_RcptName;
HdrCc:=Smtp_Recipient;
HdrTo:="";

MailMessage:=Smtp_MailMessage;
end;

Smtp.Connect;

procedure SMTP_Thread.SmtpRequestDone(
Sender: TObject;
RqType: TSmtpRequest;
ErrorCode: Word);
begin
case RqType of
smtpConnect: begin
if Smtp.AuthType = smtpAuthNone then
Smtp.Helo
else
Smtp.Ehlo;
end;
smtpHelo: Smtp.MailFrom;
smtpEhlo: Smtp.Auth;
smtpAuth: Smtp.MailFrom;
smtpMailFrom: Smtp.RcptTo;
smtpRcptTo: Smtp.Data;
smtpData: Smtp.Quit;
smtpQuit: begin
Smtp.Free;
Terminate;
end;
end;
end;


 
Digitman   (2003-08-28 14:07) [16]


> при выполнении Smtp.Connect (начиная со второго потока)
> получаю исключение


и какое же ? конкретно ?
столько флуда вокруг да около, а сути происходящего до сих пор не услышано от тебя)


 
Прохожий   (2003-08-28 14:20) [17]

Сейчас просто немогу сказать. У меня делфи дома стоит, а я на работе. Завтра напишу


 
Digitman   (2003-08-28 14:47) [18]


> Прохожий


поиск "граблей" начинать всегда нужно именно с анализа класса/текста исключения)
в подавляющем большинстве случаев это позволяет быстро сориентироваться в причинах его возникновения


 
Прохожий   (2003-08-29 10:47) [19]

Кажись я нашёл косяк. После вызова Smtp.Connect; заканчиваеться поток и уничтожаеться. А на отправку нужно время. Хотя мне это непонятно. Я же указал в конструкторе FreeOnTerminate := False;
Если поставить, что то что не даст этого сделать, например ShowMessage("QWE"), то всё работает. А вот как заставить поток ждать завершения работы SmtpCli я не знаю :(


 
Reindeer Moss Eater   (2003-08-29 11:21) [20]

А вот как заставить поток ждать завершения работы SmtpCli я не знаю :(

Зачем вторичный поток заставлять "ждать"?
Зачем вообще вторичный поток?
Есть события у класса и надо лишь их обрабатывать.
Поток не нужен сто лет.


 
Прохожий   (2003-08-29 12:31) [21]

При разружении потока освободжаються и все объекты, которые были им созданы. Я правильно понимаю?


 
Reindeer Moss Eater   (2003-08-29 12:32) [22]

Если эти объекты имели в качестве Owner"а сам поток


 
Прохожий   (2003-08-29 12:40) [23]

Ну вот. Какие я буду обрабатывать события, если объекта уже нет?


 
Прохожий   (2003-08-29 12:44) [24]

Ну вот. Какие я буду обрабатывать события, если объекта уже нет? А насчёт нужности потоков - почитай выше: http://delphimaster.net/view/14-1060575544/


 
Reindeer Moss Eater   (2003-08-29 12:46) [25]

Ну вот. Какие я буду обрабатывать события, если объекта уже нет?
А кто заставляет тебя убивать объекты?

А насчёт нужности потоков - почитай выше
Про нужность потоков я могу узнать из справочной документации.


 
Прохожий   (2003-09-01 10:12) [26]

Так никто не скажет ответ на вопрос? А вот как заставить поток ждать завершения работы SmtpCli ?


 
Digitman   (2003-09-01 11:30) [27]


> А вот как заставить поток ждать завершения работы SmtpCli
> ?


примерно так :

procedure SMTP_Thread.SmtpRequestDone(
Sender: TObject;
RqType: TSmtpRequest;
ErrorCode: Word);
begin
case RqType of
....
smtpQuit: begin
Terminate;
PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
end;
end;
end;

var
Msg: TMsg;
...
Smtp.Connect;
while not Terminated and GetMessage(msg, 0, 0, 0) do
DispatchMessage();
Smtp.Free;
....



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

Форум: "Потрепаться";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.017 c
14-71839
Карелин Артем
2003-09-01 13:35
2003.09.22
Перепись. Ненормальная.


1-71625
Вован
2003-09-09 11:57
2003.09.22
Что-то не получается в TPopumMenu один из TMenuItem сделать


14-71903
Ru
2003-09-03 13:28
2003.09.22
На счет хостинга:


14-71952
pasha_676
2003-09-02 10:43
2003.09.22
Надо начинать поиски работы


1-71586
saNat
2003-09-10 02:10
2003.09.22
MainMenu





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