Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про поток...   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.066 c
2-1187331865
White Barsik
2007-08-17 10:24
2007.09.09
Динамическое добавление контрола


15-1186590146
Mozart
2007-08-08 20:22
2007.09.09
Я в шоке от таких запросов!!!!


8-1165161356
IMHO
2006-12-03 18:55
2007.09.09
Формат SWF (Flash)


2-1187270000
mif99
2007-08-16 17:13
2007.09.09
как в richedit изменить фон одного слова


2-1187218781
{RASkov}
2007-08-16 02:59
2007.09.09
Как принудительно обновить размер колонок в ListView?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский