Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.022 c
15-1186782789
Petr V. Abramov
2007-08-11 01:53
2007.09.09
C. Иванов привазвал наказывать за уклонение от :")


2-1187264005
Johnnnnnnn
2007-08-16 15:33
2007.09.09
Генератор паролей помогите разобраться


15-1186675833
kernel
2007-08-09 20:10
2007.09.09
Выбираем *nix ?!


2-1187172815
Poroshm
2007-08-15 14:13
2007.09.09
Продолжительность MP3 файла


3-1178991672
TheEd
2007-05-12 21:41
2007.09.09
Как получить Description для полей (IB7.0, D7, FIBPlus)?