Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2011, 03:31   #1
AnKor94
Пользователь
 
Регистрация: 24.11.2009
Сообщений: 54
По умолчанию Приручение idFTP.get

Программа аплодит несколько файлов на ftp сервер.
При нажатии на кнопку отправить она "не отвечает" пока не закончит процесс. Выглядит это очень некрасиво.
Как приручить процесс отправки? Лучше всего с прогрессбаром..
141.116.168.135 : damiu2d449028.dami.army.pentagon.mi l (.MIL | US Military)
AnKor94 вне форума Ответить с цитированием
Старый 09.01.2011, 03:55   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Поток TThread и прогрессбар, методы OnWorkbegin,OnWork,OnWorkEnd.

Вот для TidHTTP, поток загрузки.
Код:
unit Unit2;

interface

uses
  Classes,IdHTTP,IdComponent;

type
  TidThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure HttpWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
    procedure HTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
    procedure HTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
  end;

implementation

uses Unit1;

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TidThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ TidThread }

procedure TidThread.Execute;
var
  sfile:TMemoryStream;
  http:TIdHTTP; //обьявляем компонент
begin
  sFile:=TMemoryStream.Create;
  http:=TIdHTTP.Create(nil); //создаём компонент(Динамически в потоке)
  try
присвайваем ему событийные процедуры
  http.OnWork:=HttpWork; //загружаем файл
  http.OnWorkBegin:=HTTPWorkBegin; //начало работы
  http.OnWorkEnd:=HTTPWorkEnd; //конец работы

//грузм файл в memoryStream
  http.get(Form1.FileLinkEdit.Text,Sfile);
//сохраняем
  Sfile.SaveToFile('TEST.exe');
  finally
//отваливаем 
  sfile.Free;
  http.Free;
  end;
  { Place thread code here }
end;


procedure TidThread.HttpWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
    if AWorkMode=WmRead then //режим чтение
  Form1.FileProgress.Progress:=AWorkCount; //передаём в прогресс число прочитанных байт
end;

procedure TidThread.HTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
    if AWorkMode=WmRead then//режим чтение
  Form1.FileProgress.MaxValue:=AWorkCountMax; //передаём в Progress.MAX значение, сколько всего байт в файле
end;

procedure TidThread.HTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
if AWorkMode=WmRead then //режим чтение файла
 Form1.FileProgress.Progress:=0; //устанавливаем прогресс в 0
end;


end.
код для TidHTTP
Вместо TprogressBar используется TGuage, разницы в них не много.
это код потока одного и тестовых моих примеров. Думаю не сложно.
АНАЛОГИЧНО и 100% также можно и для idFTP. Удачи!

Последний раз редактировалось Человек_Борща; 09.01.2011 в 03:58.
Человек_Борща вне форума Ответить с цитированием
Старый 01.12.2014, 00:51   #3
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Поток TThread и прогрессбар, методы OnWorkbegin,OnWork,OnWorkEnd.
Код:
//присвайваем ему событийные процедуры
  http.OnWork:=HttpWork; //загружаем файл
  http.OnWorkBegin:=HTTPWorkBegin; //начало работы
  http.OnWorkEnd:=HTTPWorkEnd; //конец работы
Подскажите, почему компилятор ругается на эти строки
[DCC Error] ThFTPWorkingU.pas(40): E2009 Incompatible types: 'Parameter lists differ'
tarakan1983 вне форума Ответить с цитированием
Старый 01.12.2014, 02:19   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
[DCC Error] ThFTPWorkingU.pas(40): E2009 Incompatible types: 'Parameter lists differ'
Обновите объявленные методы OnWorkbegin,OnWork,OnWorkEnd в соотв. с их прототипами из событий компонента. Код был для Delphi 7.
Человек_Борща вне форума Ответить с цитированием
Старый 01.12.2014, 02:27   #5
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Обновите объявленные методы OnWorkbegin,OnWork,OnWorkEnd в соотв. с их прототипами из событий компонента. Код был для Delphi 7.
Да там вроде ничего не поменялось, кроме Int64, но их я менял, ошибка та же
вот прям из компоненты
Код:
procedure TFmMain.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin

end;

procedure TFmMain.IdFTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin

end;

procedure TFmMain.IdFTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin

end;
Вот полный код
Код:
unit FTPThread;
interface
uses
  Classes, IdFtp, IdComponent;
type
  WorkThread = class(TThread)
  private
    ftpHost, ftpDir,
    ftpFile, ftpLocalPath,
    ftpUser, ftpPasswd: String;
    aFtp: TIdFTP;
    destructor Destroy;
  protected
    constructor Create(CreateSuspended: boolean);
    procedure Execute; override;
    procedure FTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Int64);
    procedure FTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
  end;
implementation
uses main;
{ WorkThread }
procedure WorkThread.FTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Int64);
begin
  Form1.ProgressBar1.Position := AWorkCount;
end;
procedure WorkThread.FTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  Form1.ProgressBar1.Max := aFtp.Size(ftpFile);
end;
constructor WorkThread.Create;
begin
  ftpHost := 'ftp.ncdc.noaa.gov';
  ftpDir := '/pub/data/inventories/';
  ftpFile := 'ISH-HISTORY.TXT';
  ftpUser := 'ftp';
  ftpPasswd := 'ftp@example.com';
  ftpLocalPath := 'D:\' + ftpFile;
  aFtp := TIdFTP.Create(nil);
  aFtp.OnWork := FTPWork;
  aFtp.OnWorkBegin := FTPWorkBegin;
  inherited Create(CreateSuspended);
end;
destructor WorkThread.Destroy;
begin
  aFtp.Free;
  inherited Destroy;
end;
procedure WorkThread.Execute;
begin
  { Place thread code here }
  aFtp.Connect;
  aFtp.ChangeDir(ftpDir);
  aFtp.Get(ftpFile, ftpLocalPath);
  aFtp.Disconnect;
end;
end.
Пересмотрел свой код еще раз на форуме и понял, что лохонулся, спасибо Человек_Борща

Последний раз редактировалось tarakan1983; 01.12.2014 в 03:26.
tarakan1983 вне форума Ответить с цитированием
Старый 01.12.2014, 03:34   #6
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Кстати, в XE7 появился System.Threading, документации практически нет, но выглядит всё довольно безобидным: http://www.youtube.com/watch?v=rZfux...BzPhbgA#t=1610
StriderX вне форума Ответить с цитированием
Старый 01.12.2014, 09:18   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Кстати, в XE7 появился System.Threading
Может зачатки потокобезопасного RTL, это сейчас модно и эффективно.
Человек_Борща вне форума Ответить с цитированием
Старый 01.12.2014, 10:34   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Может зачатки потокобезопасного RTL, это сейчас модно и эффективно.
ну это довольно удобно.
правда как обычно в Делфи это идет из иной среды позаимствовали.
Неплохо конечно, развитие.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачать папку по idftp casper0094 Работа с сетью в Delphi 2 02.07.2010 22:10
IDFTP не показывать ошибку. sergeyrulit Общие вопросы Delphi 1 02.06.2010 02:33
Вопрос по idFTP Johnson Работа с сетью в Delphi 3 09.11.2009 13:07
idFTP и TreeView vitawt Работа с сетью в Delphi 3 21.02.2009 02:04
Проблема с IDFTP esy Работа с сетью в Delphi 4 04.12.2008 18:22