Форум: "Прочее";
Текущий архив: 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