Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Многопоточный запуск [D7, WinXP]


yury1 ©   (2007-07-19 13:11:00) 

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


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


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


Что не нужно?


Stanislav   (2007-07-20 17:15:00) [2]

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


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

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

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

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

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


iXT   (2007-07-20 15:33:00) [4]

> [7] yury1   (20.07.07 13:24)

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


iXT   (2007-07-20 15:31:00) [5]

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

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


Stanislav   (2007-07-20 13:48:00) [6]

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


Anatoly Podgoretsky   (2007-07-20 13:47:00) [7]


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

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


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


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


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


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

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


Stanislav   (2007-07-20 13:30:00) [10]

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


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

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

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 клиента так и остались на фтп).
Такого быть не должно!


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

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

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


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


> yury1   (20.07.07 12:51) [3]


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


StriderMan   (2007-07-20 12:57:00) [14]


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

var
 ftp: TidFTp;
begin
.....

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


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

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


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


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


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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо