Форум: "Потрепаться";
Текущий архив: 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