|
Вопрос # 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|