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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
1-71589
Dragoon
2003-09-09 23:11
2003.09.22
Как записывать в файл строки не по порядку?


1-71718
Condor
2003-09-10 16:32
2003.09.22
Как сохранить (а главное прочитать) несколько картнок в один пото


6-71811
Sasha NT
2003-07-21 01:43
2003.09.22
Програмный разрыв соединения?


1-71636
Raper
2003-09-09 09:43
2003.09.22
Помогите перевести String в Char


14-71865
МаХиМ
2003-09-02 18:02
2003.09.22
Как создать заставку для программы?