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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2016, 13:52   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
Вопрос TIdTCPServer и ProgressBar

Так получаю файл от клиента
Код:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  FS: TFileStream;
  FPath, FName: String;
begin
  FPath := ExtractFilePath(Application.ExeName) + 'Downloads';
  FName := AContext.Connection.IOHandler.ReadLn;

  if not DirectoryExists(FPath) then ForceDirectories(FPath);

  FS := TFileStream.Create(FPath + '\' + ExtractFileName(FName), fmCreate); // Сохранение
  try
    AContext.Connection.IOHandler.ReadStream(FS, -1, True); // Поток передаваемый клиентом
  finally
    FreeAndNil(FS);;
  end;

  AContext.Connection.Disconnect;

  Label1.Caption := 'Файл принят';
end;
Хочу подключить ProgressBar, но вся загвоздка в том, что приём идёт в отдельном потоке
Код:
AContext.Connection.IOHandler.ReadStream
и как туда залезть без понятия.
Помогите, пожалуйста, решить задачу.

Последний раз редактировалось Shouldercannon; 19.02.2016 в 14:00.
Shouldercannon вне форума Ответить с цитированием
Старый 19.02.2016, 14:22   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
и как туда залезть без понятия.
События TIdIOHandler смотри.

284963.jpg
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 20.02.2016, 14:15   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Код:
unit Unit1;
...
const
  Host = '192.168.0.10';
  Port = 1120;
  MY_MESS = WM_USER + 105;

type
  TForm1 = class(TForm)
...
  private
    { Private declarations }
    procedure MyProgress(var Msg: TMessage); message MY_MESS;
    procedure Work(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
    procedure WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCountMax: Int64);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  FS: TFileStream;
  FPath, FName: String;
begin
  FPath := ExtractFilePath(Application.ExeName) + 'Downloads';
  FName := AContext.Connection.IOHandler.ReadLn;

  if not DirectoryExists(FPath) then ForceDirectories(FPath);

  FS := TFileStream.Create(FPath + '\' + ExtractFileName(FName), fmCreate); // Сохранение
  try
    {ProgressBar1.Max := AContext.Connection.IOHandler.ReadLongInt; //!// Не скачивается 4 байта
    ProgressBar1.Position := 0;}

    AContext.Connection.OnWork := Work;
    AContext.Connection.OnWorkBegin := WorkBegin;
    AContext.Connection.IOHandler.ReadStream(FS, -1, True); // Поток передаваемый клиентом
  finally
    FreeAndNil(FS);;
  end;

  AContext.Connection.Disconnect;

  Label1.Caption := 'Файл принят';
end;

procedure TForm1.MyProgress(var Msg: TMessage);
begin
  case Msg.WParam of
  0: begin
    ProgressBar1.Max := Msg.LParam;
    ProgressBar1.Position := 0;
  end;

  1: ProgressBar1.Position := Msg.LParam;
  end;
end;

procedure TForm1.Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  PostMessage(Self.Handle, MY_MESS, 1, AWorkCount);
end;

procedure TForm1.WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
  PostMessage(Self.Handle, MY_MESS, 0, AWorkCountMax);
end;

end.
AWorkCountMax равен нулю, зато AWorkCount не равен нулю.
Сделал так
Код:
ProgressBar1.Max := AContext.Connection.IOHandler.ReadLongInt;
И получил проблемы:
1. ProgressBar доходит только до 1/3
2. Файл скачивается не полностью
Отправляемый файл: 344 МБ (361*402*544 байт)
Полученный файл: 344 МБ (361*402*540 байт)
4 байта тю-тю
Shouldercannon вне форума Ответить с цитированием
Старый 20.02.2016, 15:05   #4
vlad1389
Форумчанин
 
Регистрация: 02.02.2016
Сообщений: 290
По умолчанию

Видимо перевод строки не считается за тело файла. Оттого и -4 байта. Не трогайте ProgressBar1.Max. Считайте скачиваемый процент.
Цитата:
AWorkCountMax равен нулю
Возможно клиент не верно передаёт headers, откуда и считается AWorkCountMax.

Последний раз редактировалось vlad1389; 20.02.2016 в 15:08.
vlad1389 вне форума Ответить с цитированием
Старый 20.02.2016, 16:47   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Цитата:
Сообщение от vlad1389 Посмотреть сообщение
Не трогайте ProgressBar1.Max. Считайте скачиваемый процент.
Это как?
Shouldercannon вне форума Ответить с цитированием
Старый 20.02.2016, 20:31   #6
vlad1389
Форумчанин
 
Регистрация: 02.02.2016
Сообщений: 290
По умолчанию

Вы не умеете считать проценты? Вспомните школу.
Код:
Х = 100 * В / А
X - результат в процентах
A - AWorkCountMax
B - AWorkCount
Соответственно всегда имеем результат от нуля до ста. Прогресс бар по умолчанию имеет тот же диапазон.
P.S. данное замечание не имеет ни какого отношения к исправлению ошибки. Просто так по феншую будет )))

Последний раз редактировалось vlad1389; 20.02.2016 в 20:44.
vlad1389 вне форума Ответить с цитированием
Старый 22.02.2016, 17:24   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Вот где проблема
Код:
procedure TForm1.MyServerProgress(var Msg: TMessage);
begin
  case Msg.WParam of
  0: begin
    SProgressBar.Max := Msg.LParam; // Фаталити
    SProgressBar.Position := 0;
  end;

  1: SProgressBar.Position := Msg.LParam;
  end;
end;
Msg.LParam не может вместить 3886585856

Последний раз редактировалось Shouldercannon; 22.02.2016 в 17:54.
Shouldercannon вне форума Ответить с цитированием
Старый 22.02.2016, 17:40   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Вот где бомбит
Msg.LParam = -408381440 при работе с 3886585856
Все правильно. В тип Integer число 3886585856 не влезает.
northener вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TIdTCPServer грузит процесоор Hottabych Работа с сетью в Delphi 7 14.09.2013 11:26
Как отправить текст с TidTCPServer на TidTCPClient? cyberexpert Работа с сетью в Delphi 0 19.09.2011 23:26
Проблеми з TIdTcpServer(Delphi); Balanar Помощь студентам 0 10.07.2011 02:33
Проблема с кодировкой в TIdTCPServer&TIdTCTClient RNT Работа с сетью в Delphi 6 08.07.2009 14:34
Проблема с TidTCPServer andrey4623 Работа с сетью в Delphi 3 18.08.2008 09:15