| 
| 
 | Вопрос # 5 426/ вопрос решён / | 
 |  Здравствуйте, уважаемые эксперты!Попробовал организовать передачу файла через сокеты...
 Нашёл в инете статью - http://www.winsov.ru/delphi062.php
 Столкнулся со следующей проблемой - некорректно работает прогресс бар сервера. Как мне его поправить? фрагмент кода
 И если несложно - помогите прикрутить показ скорости загрузки файла. Заранее благодарен)
 
|  |   Вопрос задал: Rusya (статус: Посетитель)Вопрос отправлен: 20 июня 2011, 00:08
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 21 июня 2011, 14:59; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 20 июня 2011, 08:21 [#1]:Я посмотрел предложенный код. К такому коду не прикрутишь прогрессбар, там даже цикла нету. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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 (статус: Посетитель), 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 (статус: Посетитель), 20 июня 2011, 23:01 [#4]:В общем, прогресс бар прикрутил! Смысл такой - клиент в цикле шлёт мессаджи о состоянии загрузки серверу, а север, в свою очередь, циклически считывает эти мессаджи)
 Осталось разобраться со скоростью загрузки...
 Как это организовать? У кого есть какие идеи?)
 |  
|   | Вадим К (статус: Академик), 21 июня 2011, 10:33 [#5]:Как сделать показ скорости? Самый простой вариант - запоминаем время начала передачи (это легко определяется с помощью now или GetTickCount). Дальше, в каждый последующий момент узнаем текущее время и разделив переданный объем на разницу времени как раз и получаем скорость.
 
 Вариант второй - ставим таймер, на одну секунду. Каждую секунду узнаем кол-во переданных данных, интервал известен
   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Rusya (статус: Посетитель), 21 июня 2011, 14:59 [#6]:Вадим К, спасибо. Теперь всё работает, как я хотел) |  22 июня 2011, 16:18: Статус вопроса изменён на решённый (изменил автор вопроса — Rusya) 23 июня 2011, 20:29: Вопрос вновь открыт (изменение состояния произвёл автор вопроса — Rusya) 28 июня 2011, 16:27: Статус вопроса изменён на решённый (изменил автор вопроса — Rusya) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |