Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 426

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
Попробовал организовать передачу файла через сокеты...
Нашёл в инете статью - http://www.winsov.ru/delphi062.php
Столкнулся со следующей проблемой - некорректно работает прогресс бар сервера. Как мне его поправить? фрагмент кода
И если несложно - помогите прикрутить показ скорости загрузки файла. Заранее благодарен)

Rusya Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Rusya (статус: Посетитель)
Вопрос отправлен: 20 июня 2011, 00:08
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 21 июня 2011, 14:59; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 20 июня 2011, 08:21 [#1]:

Я посмотрел предложенный код. К такому коду не прикрутишь прогрессбар, там даже цикла нету.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Rusya

Rusya (статус: Посетитель), 20 июня 2011, 12:40 [#2]:

min@y™, наверно, не всё так безнадёжно...
Немного перековырял код сервера -
procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  if Socket.ReceiveText = 'end' then
    begin
      StatusBar1.SimpleText := 'Клиент принял файл';
      MS.Free; // Убиваем буфер
    end
  else
    ProgressBar1.Position := StrToInt(Socket.ReceiveText);
end;
Чтение мессаджей клиента о состоянии загрузки файла теперь в цикле. Но проблема отправки этих самых мессаджей с самого клиента. Не пойму из-за чего проблема. Может клиент в режиме приёма файла не может отправлять текст?
Rusya

Rusya (статус: Посетитель), 20 июня 2011, 12:54 [#3]:

На всякий случай прикрепил и процедуру отправки мессаджей с клиента...
procedure TForm1.Writing(Text: string);
var
  Start, Finish, WaitCal, iCounterPerSec: TLargeInteger;
begin
  if MS.Size < Size then // Если принято байт меньше размера файла, то...
    begin
      Application.ProcessMessages;
      MS.Write(Text[1], Length(Text)); // Записываем в буфер
      ProgressBar1.Position := MS.Size*100 div Size;
      Label3.Caption := IntToStr(MS.Size*100 div Size)+' %';
      ClientSocket1.Socket.SendText(IntToStr(MS.Size*100 div Size)); // Отправляем серверу мессадж
      StatusBar1.SimpleText := 'Принято '+FormatFloat('0.00', (MS.Size / 1048576))+' Мб из '+FormatFloat('0.00', (Size /
1048576))+' Мб';
    end;
P.S. Прогресс бар у клиента рабочий...
Rusya

Rusya (статус: Посетитель), 20 июня 2011, 23:01 [#4]:

В общем, прогресс бар прикрутил!
Смысл такой - клиент в цикле шлёт мессаджи о состоянии загрузки серверу, а север, в свою очередь, циклически считывает эти мессаджи)
Осталось разобраться со скоростью загрузки...
Как это организовать? У кого есть какие идеи?)
Вадим К

Вадим К (статус: Академик), 21 июня 2011, 10:33 [#5]:

Как сделать показ скорости?
Самый простой вариант - запоминаем время начала передачи (это легко определяется с помощью now или GetTickCount). Дальше, в каждый последующий момент узнаем текущее время и разделив переданный объем на разницу времени как раз и получаем скорость.

Вариант второй - ставим таймер, на одну секунду. Каждую секунду узнаем кол-во переданных данных, интервал известен:)
Галочка "подтверждения прочтения" - вселенское зло.
Rusya

Rusya (статус: Посетитель), 21 июня 2011, 14:59 [#6]:

Вадим К, спасибо. Теперь всё работает, как я хотел)

22 июня 2011, 16:18: Статус вопроса изменён на решённый (изменил автор вопроса — Rusya)

23 июня 2011, 20:29: Вопрос вновь открыт (изменение состояния произвёл автор вопроса — Rusya)

28 июня 2011, 16:27: Статус вопроса изменён на решённый (изменил автор вопроса — Rusya)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.03 сек.