![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про поток... [D6, XP]
vegarulez © (2007-08-09 11:25:00)Привет всем мастерам! Пытаюсь отправить почту в потоке, чтобы эта процедура не вешала приложение. почитал про потоки и вот получился вот такой код:
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 и ругается и тоже не хочет компилится... подскажите как сделать правильно...
vegarulez (2007-08-13 17:32:00) [1]А... понял... типа использовать метод Create в создаваемом мною потоке, а после в созданние компненты - передавать ей параметры, с формы.
Так? Я всё правильно понял?
Сергей М. (2007-08-13 08:19:00) [2]
> как тогда быть
Создавай smtp-компонент в ран-тайм в конструкторе доп.потока на основании параметров, передаваемых в конструктор основным потоком.
Убирай работу с этим smtp-компонентом из синхронизируемого метода.
vegarulez (2007-08-12 20:00:00) [3]Форумчане, подскажите, как тогда быть то?
vegarulez (2007-08-12 13:42:00) [4]Ну дак я же правильно всё сделал... и перевёл нормально, что он без Synchronize(UpdateMsgSend); не сможет вызвать метод отправки... из Form1...
Как мне тогда быть?
vegarulez (2007-08-12 12:42:00) [5]Сергей М. © (10.08.07 08:38) [10]
да есть уже он там... нифига не помогает... я потому за потоки и взялся, потому что он не спасает...
medved_68 © (09.08.07 18:11) [9]
Сечас повнимательнее прочту... со словариком на перевес...
Сергей М. (2007-08-10 08:38:00) [6]
> Тока вот таймеры почему то висят
Потому что осн.поток занят выполнением блокирующего метода SMTP.Send()
Брось на форму TIdAntifreeze - он в какой-то мере избавит от проблемы "виса".
Но тогда и доп.поток нафиг не нужен)
medved_68 (2007-08-09 18:11:00) [7]
> отправка выполняется в потоке...
vegarulezочень сильно заблуждаешься. :))) Отправка происходит в контексте основноготреда, чему очень сильно способствует метод Synchronize(UpdateMsgSend);:))) Не зря тебе посоветовали почитать комменты, которые Дельфи вставляет при добавлении класса TThreadв проект.
vegarulez (2007-08-09 17:11:00) [8]Германн © (09.08.07 14:00) [7]
Комментрарии сами создаются когда шаблон потока заводишь ...
Loginov Dmitry © (09.08.07 13:52) [6]
тем что приложениее не виснет когда почту отправляет ...
отправка выполняется в потоке...
Тока вот таймеры почему то висят :(...
Германн (2007-08-09 14:00:00) [9]
> сам придумал... так что не плагиат :)
>
И комментарии на аглицком сам писАл?
Тогда прочитай их повнимательнее. :)
Loginov Dmitry (2007-08-09 13:52:00) [10]
> сам придумал... так что не плагиат
молодец. Тока скажи, чем тебе помог в данном случае поток Tmsgsend
vegarulez (2007-08-09 13:50:00) [11]не знавал такого.. :)
сам придумал... так что не плагиат :)
Loginov Dmitry (2007-08-09 13:22:00) [12]Его школа ...
:(
Германн (2007-08-09 13:04:00) [13]
> vegarulez © (09.08.07 12:26) [2]
>
> псп. всё заработало...
>
(с) Архангельский :-)
vegarulez (2007-08-09 12:26:00) [14]псп. всё заработало...
Юрий Зотов (2007-08-09 11:30:00) [15]Пропишите uses Unit1 после слова implementation.