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

Вниз

Можно ли использовать невизуальные компоненты в др. потоке?   Найти похожие ветки 

 
И. Павел ©   (2010-09-29 08:27) [0]

Здравствуйте.

Подскажите, пожалуйста, можно ли делать рассылку почты в неосновном потоке (без синхронизации), если почтовые компоненты (TIDSMTP и TIDMessage) создаются в функции Execute, т.е. недоступны из других потоков? Это невизуальные компоненты, так что надеюсь, что можно, но на всякий случай хочу уточнить, т.к. основной поток такими длительными операциями лучше не загружать.

Заранее спасибо.

PS: Вот примерный код почтового потока:

type
 TMailThread = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
 end;

implementation

procedure TMailThread.Execute;
var IdSMTP: TIDSMTP;
   Msg: TIDMessage;
begin
//...
 IdSMTP := TIDSmtp.Create(Application);

 IdSMTP.Host := "...";
 IdSMTP.Port := 25;

 IdSMTP.Connect;
 if IdSMTP.Connected = true then
 begin
   Msg := TIDMessage.Create(Application);
   Msg.CharSet := "UTF-8";
   Msg.ContentType := "text/plain";
   Msg.Subject := "...";
   Msg.Recipients.EMailAddresses := "...";
   Msg.From.Address := "...";
   Msg.From.Name := "...";
   Msg.Date := now;
   IdSMTP.Send(Msg);
   IdSMTP.Disconnect;
 end;
//...
end;


 
Дмитрий С ©   (2010-09-29 08:39) [1]

Да, а чего нет то?


 
И. Павел ©   (2010-09-29 08:50) [2]

> Да, а чего нет то?

Спасибо.
Просто на всякий случай спросил. А то мало ли какие подводные камни могут быть :)


 
Jumbo   (2010-09-29 10:04) [3]

>> IdSMTP := TIDSmtp.Create(Application);

В таком варианте категорически нет.

Не знаю нюансов Indy, но, возможно так будет работать:

IdSMTP := TIDSmtp.Create(nil);
try
 <...>
finally
  IdSMTP.Free;
end;


 
Jumbo   (2010-09-29 10:05) [4]

Дмитрий С ©   (29.09.10 08:39) [1] Да, а чего нет то?

Потому что VCL - потокоНЕзащищенная библиотека.


 
Игорь Шевченко ©   (2010-09-29 10:24) [5]


>
> Потому что VCL - потокоНЕзащищенная библиотека.


Вся ?


 
Jumbo   (2010-09-29 12:02) [6]

>>Игорь Шевченко ©   (29.09.10 10:24) [5]

Ну что за глупые риторические вопросы? Как будто сам ответа не знаешь. Взаимодействие компонентов, в частности, что касается владения компоненами (Owner) - не защищено. Поэтому использование Application в отдельном потоке - небезопасно.


 
И. Павел ©   (2010-09-29 12:03) [7]

> использование Application в отдельном потоке - небезопасно

Спасибо. Забыл Application на nil сменить - при закрытии приложения сам на ошибку наткнулся, т.к. объект потока удалился раньше времени.


 
Jumbo   (2010-09-29 12:09) [8]

>>Поэтому использование Application в отдельном потоке - небезопасно.

В смысле, использоваение в конексте данного вопроса, то есть, передача Application в качестве Owner"а для создаваемых объектов.
Впрочем, использовать Application в отдельном потоке вообще не следует. Возможное исключение - элементы ОС, используемые самим Application, то есть, всякого рода Handle. Да и то, прежде чем их использовать, следует получить их от Application, а получать их от Apllication  следует осторожно.
В общем, если не учитывать всех нюансов, то лучше не соваться вовсе.


 
Anatoly Podgoretsky ©   (2010-09-29 12:23) [9]

> И. Павел  (29.09.2010 08:27:00)  [0]

Весь Инди, если не читать извращений, расчитан на работу только в потоках.


 
Anatoly Podgoretsky ©   (2010-09-29 12:26) [10]

> Игорь Шевченко  (29.09.2010 10:24:05)  [5]

Вся, а частные случаи недокументированы.


 
Игорь Шевченко ©   (2010-09-29 13:02) [11]

Jumbo   (29.09.10 12:02) [6]


> Поэтому использование Application в отдельном потоке - небезопасно.


Программку написать ? Или так поверишь


 
Игорь Шевченко ©   (2010-09-29 13:03) [12]

Anatoly Podgoretsky ©   (29.09.10 12:26) [10]

Это для правоверных, чтобы с пути не сбивались


 
Jumbo   (2010-09-29 13:51) [13]

Программку написать ? Или так поверишь

Достаточно посмотреть на это:

procedure TComponent.Insert(AComponent: TComponent);
begin
 if FComponents = nil then FComponents := TList.Create;
 FComponents.Add(AComponent);
 AComponent.FOwner := Self;
end;

procedure TComponent.Remove(AComponent: TComponent);
begin
 AComponent.FOwner := nil;
 FComponents.Remove(AComponent);
 if FComponents.Count = 0 then
 begin
   FComponents.Free;
   FComponents := nil;
 end;
end;


Программка, хитро использующая что-то там от Application, не сделает Application потокозащищенным в целом.


 
И. Павел ©   (2010-09-29 14:31) [14]

Всем спасибо.
Сделал отдельный поток с собственными connection, adodataset и indy без владельцев. Вроде бы все работает и не мешает основному потоку.


 
Dennis I. Komarov ©   (2010-09-29 16:11) [15]


> И. Павел ©   (29.09.10 14:31) [14]

Какого характера сообщения? Может не тащить монстра с собой, а юзать TTCPClient? SMTP протокол не сложен...



Страницы: 1 вся ветка

Текущий архив: 2011.01.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
2-1287575888
Evgeniy Efimchenko
2010-10-20 15:58
2011.01.16
Работа с типизизованными файлами


2-1287920088
George
2010-10-24 15:34
2011.01.16
TABOrder и фреймы


15-1285078090
Alkid
2010-09-21 18:08
2011.01.16
Привет с солнечного Кипра


15-1285351443
set
2010-09-24 22:04
2011.01.16
Алгоритм Робертса


15-1285865919
картман
2010-09-30 20:58
2011.01.16
я думал там все на века(((