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

Вниз

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

 
И. Павел ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
2-1287979735
Beginner2010
2010-10-25 08:08
2011.01.16
Компонент "Дерево"


2-1287087443
Alik
2010-10-15 00:17
2011.01.16
Подвисание при работе с большим динамическим массивом байтов


2-1288068191
Делфиец
2010-10-26 08:43
2011.01.16
Как декодировать сообщения из TIdPOP3


2-1287984611
vegarulez
2010-10-25 09:30
2011.01.16
TWebBrowser, открыть ссылку в том же окне?


15-1286137755
Юрий
2010-10-04 00:29
2011.01.16
С днем рождения ! 4 октября 2010 понедельник





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский