Текущий архив: 2007.09.09;
Скачать: CL | DM;
Вниз
Вопрос про поток... Найти похожие ветки
← →
vegarulez © (2007-08-09 11:25) [0]Привет всем мастерам! Пытаюсь отправить почту в потоке, чтобы эта процедура не вешала приложение. почитал про потоки и вот получился вот такой код:
unit Unit1;
interface
uses
..., unit4;
...
private
Thread1:Tmsgsend;
...
implementation
...
procedure TForm1.Button7Click(Sender: TObject);
begin
Thread1:=Tmsgsend.Create(False);
Thread1.priority:=TpIdle;
end;
...
end.
unit Unit4;
interface
uses
Classes;
type
Tmsgsend = class(TThread)
private
{ Private declarations }
protected
procedure UpdateMsgSend;
procedure Execute; override;
public
count:integer;
end;
implementation
{ Important: Methods and properties of objects in VCL or CLX can only be used
in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure Tmsgsend.UpdateCaption;
begin
Form1.Caption := "Updated in a thread";
end; }
{ Tmsgsend }
procedure Tmsgsend.UpdateMsgSend;
begin
with IdMsgSend do
begin
Body.Assign(memo1.Lines);
From.Text :=Edit1.Text;
Recipients.EMailAddresses :=Edit2.Text; { To: header }
Subject := Edit3.Text;{ Subject: header }
Priority := TIdMessagePriority(mpNormal); { Message Priority }
ReceiptRecipient.Text := From.Text;
end;
{authentication settings}
SMTP.AuthenticationType := atLogin; {Simple Login}
SMTP.UserID :=Edit4.Text;
SMTP.Password :=Edit5.Text;
{General setup}
SMTP.Host := Edit6.Text;
SMTP.Port := 25;
{now we send the message}
try
SMTP.Connect;
SMTP.Send(IdMsgSend);
Application.ProcessMessages;
SMTP.Disconnect;
except
on E: Exception do
Begin
SMTP.Disconnect;
Exit;
End;
end;
end;
procedure Tmsgsend.Execute;
begin
Synchronize(UpdateMsgSend);
//Tmsgsend.Terminate;
{ Place thread code here }
end;
end.
Так вот вопрос в том что когда добавлюя в Юнит4 в Юзес Юнит1, чтобы он обращался к компонентам которые там есть - он ругается...
[Fatal Error] Unit1.pas(9): Circular unit reference to "Unit1"
типа я так понимаю что типа и оттуда и отуда вызывается, типа так низя..
но тогда он не видит компоненты с Юнита1 и ругается и тоже не хочет компилится... подскажите как сделать правильно...
← →
Юрий Зотов © (2007-08-09 11:30) [1]Пропишите uses Unit1 после слова implementation.
← →
vegarulez © (2007-08-09 12:26) [2]псп. всё заработало...
← →
Германн © (2007-08-09 13:04) [3]
> vegarulez © (09.08.07 12:26) [2]
>
> псп. всё заработало...
>
(с) Архангельский :-)
← →
Loginov Dmitry © (2007-08-09 13:22) [4]Его школа ...
:(
← →
vegarulez © (2007-08-09 13:50) [5]не знавал такого.. :)
сам придумал... так что не плагиат :)
← →
Loginov Dmitry © (2007-08-09 13:52) [6]
> сам придумал... так что не плагиат
молодец. Тока скажи, чем тебе помог в данном случае поток Tmsgsend
← →
Германн © (2007-08-09 14:00) [7]
> сам придумал... так что не плагиат :)
>
И комментарии на аглицком сам писАл?
Тогда прочитай их повнимательнее. :)
← →
vegarulez © (2007-08-09 17:11) [8]Германн © (09.08.07 14:00) [7]
Комментрарии сами создаются когда шаблон потока заводишь ...
Loginov Dmitry © (09.08.07 13:52) [6]
тем что приложениее не виснет когда почту отправляет ...
отправка выполняется в потоке...
Тока вот таймеры почему то висят :(...
← →
medved_68 © (2007-08-09 18:11) [9]
> отправка выполняется в потоке...
vegarulez очень сильно заблуждаешься. :))) Отправка происходит в контексте основного треда, чему очень сильно способствует метод Synchronize(UpdateMsgSend); :))) Не зря тебе посоветовали почитать комменты, которые Дельфи вставляет при добавлении класса TThread в проект.
← →
Сергей М. © (2007-08-10 08:38) [10]
> Тока вот таймеры почему то висят
Потому что осн.поток занят выполнением блокирующего метода SMTP.Send()
Брось на форму TIdAntifreeze - он в какой-то мере избавит от проблемы "виса".
Но тогда и доп.поток нафиг не нужен)
← →
vegarulez © (2007-08-12 12:42) [11]Сергей М. © (10.08.07 08:38) [10]
да есть уже он там... нифига не помогает... я потому за потоки и взялся, потому что он не спасает...
medved_68 © (09.08.07 18:11) [9]
Сечас повнимательнее прочту... со словариком на перевес...
← →
vegarulez © (2007-08-12 13:42) [12]Ну дак я же правильно всё сделал... и перевёл нормально, что он без Synchronize(UpdateMsgSend); не сможет вызвать метод отправки... из Form1...
Как мне тогда быть?
← →
vegarulez © (2007-08-12 20:00) [13]Форумчане, подскажите, как тогда быть то?
← →
Сергей М. © (2007-08-13 08:19) [14]
> как тогда быть
Создавай smtp-компонент в ран-тайм в конструкторе доп.потока на основании параметров, передаваемых в конструктор основным потоком.
Убирай работу с этим smtp-компонентом из синхронизируемого метода.
← →
vegarulez © (2007-08-13 17:32) [15]А... понял... типа использовать метод Create в создаваемом мною потоке, а после в созданние компненты - передавать ей параметры, с формы.
Так? Я всё правильно понял?
Страницы: 1 вся ветка
Текущий архив: 2007.09.09;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.036 c