Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IdFTP - подвисает при закачке 
:(
    Опции темы
inside
Дата 21.7.2006, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Ребят, извините, если вопрос глупый. Считаю в процентах кол-во закаченного файла.

Код

procedure TForm3.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
var f: real;
begin
   f:=AWorkCount/max_bytes;
   f:=Round(f*100);
   StatusBar1.SimpleText:='Загружено '+FloatToStr(f)+'%';
   Form3.Refresh;
end;


max_bytes - общий размер файла

Вот только со временем, при закачке большого файла - прога виснет, но по завершении закачки отвисает. Как решить проблему? 
PM MAIL   Вверх
Nickey
Дата 22.7.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 21.7.2006

Репутация: нет
Всего: нет



ЭЭЭ,в отдельный поток может ее пихнуть? 
PM MAIL   Вверх
Matematik
Дата 22.7.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Поиграй настройками антифриза 
PM MAIL WWW ICQ   Вверх
inside
Дата 22.7.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



А что такое антифриз? Не слышал про это =(

В отдельный поток засунуть поможет? 
PM MAIL   Вверх
Snowy
Дата 23.7.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Просто найди TIdAntifreeze, брось его на форму. 
PM MAIL   Вверх
inside
Дата 27.8.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Всем ещё раз привеееет =)))

Народ, я поробовал AntiFreeze - ничего не получилось - прочитал, что он подтормаживает.. Решил поэтому сделать отдельным потоком.. Вроде нормально получилось, вот только такой вопрос - как теперь обработать события OnWork & OnWorkBegin & OnWorkEnd...????  smile

Дело в том, что я хочу отслеживать процесс закачки.. Кстати - в новом процессе я использую такой код. Всё ли правильно?!

Код

unit Unit5;

interface

uses
  Classes, IdFTP;

type
  MThread = class(TThread)
  private
    RFilePath: string;
  protected
    procedure upload(FilePath: string);
    procedure Execute; override;
  public
    property FilePath: string write RFilePath;
  end;

implementation

uses Unit3;

procedure MThread.upload(s: string);
var ftp: TIdFTP;
begin
    ftp:=TIdFTP.Create(nil);
    with ftp do begin
        Username:='nick';
        Password:='password';
        Host:='www.domen.ru';
        ftp.OnConnected:=???;
        ftp.OnWorkEnd:=???;
        ftp.OnWork:=???;
        ftp.OnWorkBegin:=???;
        Connect;
        Put(s, s);
        Disconnect;
    end;
    ftp.Free;
end;

procedure MThread.Execute;
begin
   Synchronize(upload(FilePath));
end;

end.


Пробовал просто приравнять их к процедурам - обработчикам событий. если писать через VCL... Но говорит о несовпадении типов TNotifyEvent & procedure    smile 
PM MAIL   Вверх
Snowy
Дата 27.8.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Правильно. Потому что процедура должна быть с параметром:
Код

  public
    procedure OnConnect(Sender: TObject);

PM MAIL   Вверх
inside
Дата 27.8.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



А если параметры оставить те же, что и в обработчиках событий в VCL:

procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);

они передадутся в резльтате такого равенства:

ftp.OnWork=IdFTP1Work????

только вот ещё проблема в том, что компилятор не понимает, что такое AWorkMode.... Где есть эта запись?

Спасибо!!  smile 
PM MAIL   Вверх
Snowy
Дата 27.8.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Именно. При присваивании событию, обработчик должен иметь параметры, соответствующие ожидаемых компонентом.
При этом имена переменных могут отличаться - главное количество, порядок и тип параметров.

TWorkMode находится в IdComponent.
PM MAIL   Вверх
inside
Дата 27.8.2006, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Snowy, блииииииин, точняяяяяк =))) Спасибо огромное! Побежал пробовать
PM MAIL   Вверх
inside
Дата 29.8.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



ну в общем я оформил новый поток:

Код

type
  MThread = class(TThread)
  private
    RFileSource: string;
    RFileName: string;
  protected
    procedure upload;
    procedure Execute; override;
    procedure FTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
    procedure FTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
    procedure FTPConnected(Sender: TObject);
    procedure FTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
  public
    property FileSource: string write RFileSource;
    property FileName: string write RFileName;
  end;

var max_bytes: integer;

implementation

uses Unit3, SysUtils;

procedure MThread.FTPConnected(Sender: TObject);
begin
   Form3.StatusBar1.SimpleText:='Connected!';
end;

procedure MThread.FTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
   Form3.StatusBar1.SimpleText:='Done';
end;

procedure MThread.FTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
var f: real;
begin
   f:=AWorkCount/max_bytes;
   f:=Round(f*100);
   Form3.StatusBar1.SimpleText:='Загружено '+FloatToStr(f)+'%';
   Form3.Refresh;
end;

procedure MThread.FTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
   max_bytes:=AWorkCountMAx;
end;

procedure MThread.upload;
var ftp: TIdFTP;
begin
    ftp:=TIdFTP.Create(nil);
    with ftp do begin
        Username:='...';
        Password:='...';
        Host:='domen';
        ftp.OnConnected:=FTPConnected;
        ftp.OnWorkEnd:=FTPWorkEnd;
        ftp.OnWork:=FTPWork;
        ftp.OnWorkBegin:=FTPWorkBegin;
        Connect;
        Put(RFileSource, RFileName);
        Disconnect;
    end;
    ftp.Free;
end;

procedure MThread.Execute;
var path: string;
begin
   Synchronize(upload);
end;

end.

вызываю поток следующий кодом:

  NewThread := MThread.Create(True);
  NewThread.FreeOnTerminate := True;
  try
        NewThread.FileSource := s;
        NewThread.FileName := name;
        NewThread.Resume;
  except
      NewThread.Free;
  end;


Но что-то программа всё равно подвисает.. Цыферки в статус баре один то обновляются, то подвисают. Само окно вообще всё виснет. В чём косяк. Где я напортачил?  smile 
PM MAIL   Вверх
Snowy
Дата 29.8.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



А зачем ты аплод запихал в синхронизацию? Так он у тебя в основном потоке работать будет.
Просто вызови его. Иначе смысла в треде никакого.
PM MAIL   Вверх
inside
Дата 29.8.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



 smile  smile  smile 

А в синхронизацию запихать только обновление статус бара?????  smile 

ээээ.. вот только как это сделать?! Ведь обработчики событий тогда буду вызываться в другом потоке... а оттуда нет доступа к элементам VCL... 

Это сообщение отредактировал(а) inside - 29.8.2006, 13:38
PM MAIL   Вверх
Snowy
Дата 29.8.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Сделай ещё одну процедуру для обновления контролов и вызывай её синхронизацией из OnWork.

Добавлено @ 14:03 
Цитата(inside @  29.8.2006,  13:35 Найти цитируемый пост)
а оттуда нет доступа к элементам VCL... 
Вообще-то доступ есть... Просто не рекомендуется его юзать. Но и не запрещено...

PM MAIL   Вверх
inside
Дата 29.8.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Точняк - всё сделал и всё работает отлично...

Но... вот ещё один вопросец... smile 

У меня происходит закачка файла... я хочу сделать возможность её отмены.. Но часть файла уже закачивается на сервер и я хочу сделать, чтобы при нажатии отмены этот кусок удалялся. При нажатии отмены я вызываю метод Terminate. Вот только как мне обработать закрытие и удалить файл - ведь Terminated я не могу проверять, разве что в событии OnWork... (Если можно там, то можно ли просто взять и из этой процедуры удалить файл и закрыть поток?!  smile )
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0902 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.