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

Вниз

Многопоточный запуск   Найти похожие ветки 

 
yury1   (2007-07-19 13:11) [0]

добрый день!
я создаю объект класса TidFTP во время работы программы следующим образом:
ftp:= TidFTp.create(self); (поправьте, если делаю неправильно)
причем таких объектов необходимо много.
как правильно потом их всех уничтожить, чтобы освободить используемые ресурсы?


 
Сергей М. ©   (2007-07-19 13:49) [1]

Достаточно уничтожить того, кто представлен тем самым self, фигурирующим в твоем коде.


 
Сергей М. ©   (2007-07-19 14:05) [2]


> Многопоточный


Что в твоем вопросе хоть как-либо касается потоков ?
Ничто.


 
yury1   (2007-07-20 12:51) [3]

объясню, что нужно:
есть программа, кот. проверяет каталоги. При появлении файлов, с ними нужно выполнить опред. действия, одно из которых отправка по фтп.
так вот, предположим пришло одновременно 2 файла, оба нужно отправить на разные фтп. Как это сделать корректно с обязательным последующим освобождением затраченных ресурсов?


 
StriderMan ©   (2007-07-20 12:57) [4]


> Как это сделать корректно с обязательным последующим освобождением
> затраченных ресурсов?

var
 ftp: TidFTp;
begin
.....

 ftp := TidFTp.create(nil);
 try
   отсылаем
 finally
   ftp.Free;
 end;


 
Сергей М. ©   (2007-07-20 13:00) [5]


> yury1   (20.07.07 12:51) [3]


В случае с self см. ответ в [1]


 
umbra ©   (2007-07-20 13:12) [6]

обязательно освобождать ресурсы можно, например, так

ftp:= TidFTp.create(nil);
{инициализируем св-ва}
try
ftp.Connect;
{...делаем что надо....}
finally
ftp.Disconnect;
ftp.Free;
end;


 
yury1   (2007-07-20 13:24) [7]

Для проверки написал следующее:

procedure TForm1.Button1Click(Sender: TObject);
begin
 ftp:= TIdFTP.Create(nil);
 ftp.OnStatus:= IdFTPStatus;
 ftp.Host:= "192.168.1.3";
 ftp.Username:= "yury";
 ftp.Password:= "1234";
 try
   ftp.Connect();
 except
   on E:Exception do
     ShowMessage(E.Message);
 end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if ftp.Connected then ftp.Disconnect;
 ftp.Free;
end;

так вот нажав 5 раз батон1, все ок.  смотрю на фтп 5 клиентов (нормально)
при нажатии батона2 - 1 раз, все ок (один клиент отсоединяется), при послед. нажатии "Access violation"... (и 4 клиента так и остались на фтп).
Такого быть не должно!


 
Stanislav ©   (2007-07-20 13:30) [8]

Так у тебя ftp ссылается на последний объект


 
Stanislav ©   (2007-07-20 13:31) [9]

Добавляй их в TStringList. - если не понял подробнее напишу.


 
Сергей М. ©   (2007-07-20 13:41) [10]


> yury1   (20.07.07 13:24) [7]
>
> Для проверки написал следующее


Как это связано с многопоточностью ?


 
Anatoly Podgoretsky ©   (2007-07-20 13:47) [11]


> так вот нажав 5 раз батон1, все ок.  смотрю на фтп 5 клиентов
> (нормально)
> при нажатии батона2 - 1 раз, все ок (один клиент отсоединяется),
>  при послед. нажатии "Access violation"... (и 4 клиента
> так и остались на фтп).

Раз у тебя это работает, то достаточно применить локальные переменные.


 
Stanislav ©   (2007-07-20 13:48) [12]

Anatoly Podgoretsky ©   (20.07.07 13:47) [11]
ему надо их 2-й кнопкой их уничтожать


 
iXT ©   (2007-07-20 15:31) [13]

> [10] Сергей М. ©   (20.07.07 13:41)
>
> > yury1   (20.07.07 13:24) [7]
> >
> > Для проверки написал следующее
>
>
> Как это связано с многопоточностью ?

Ну в принципе связанно, тока он не знает об этом :)


 
iXT ©   (2007-07-20 15:33) [14]

> [7] yury1   (20.07.07 13:24)

Ну и расскажи чего получается, когда ты несколько раз давишь на кнопку1?


 
yury1   (2007-07-20 17:05) [15]

to Stanislav и Anatoly Podgoretsky: спасибо за ответы по теме.
to Stanislav: про TStringList подробнее можно?

Вопрос 2: Если я буду процедуру вида:

ftp:= TidFTp.create(nil);
{инициализируем св-ва}
try
ftp.Connect;
{...делаем что надо....}
finally
ftp.Disconnect;
ftp.Free;
end;

вызывать одновременно из нескольких мест программы, не будут ли они пересекаться? имеется ввиду, если одновременно придут 2 файла: один поток обратится к этой процедуре с одними параметрами (адрес фтп, уч. запись), второй с другими.


 
Stanislav ©   (2007-07-20 17:15) [16]

ftp:= TidFTp.create(nil);
{инициализируем св-ва}
try
ftp.Connect;
{...делаем что надо....}
finally
ftp.Disconnect;
ftp.Free;
end;
В этом случае тебе не нужно.
Это тебе может понадобится только если ты захочешь управлять создаными ftp (тогда все указатели тебе нужно будет хранить) если нет, то сразу удаляй их и все.


 
yury1   (2007-07-20 18:14) [17]


> В этом случае тебе не нужно.


Что не нужно?



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

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

Наверх




Память: 0.51 MB
Время: 0.017 c
2-1185191496
gen
2007-07-23 15:51
2007.08.19
Прошу помощи мастера


15-1184750417
БарЛог
2007-07-18 13:20
2007.08.19
Сумма нескольких полей MySQL


15-1184790249
Труп Васи Доброго
2007-07-19 00:24
2007.08.19
Как сделать VPN?


3-1177566685
MZ
2007-04-26 09:51
2007.08.19
узнать количество суток между двумя датами в FireBird


2-1185474090
Sonic90
2007-07-26 22:21
2007.08.19
TTrackBar в PopupMenu