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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2010, 11:33   #1
Horus92
Форумчанин
 
Аватар для Horus92
 
Регистрация: 04.05.2009
Сообщений: 147
По умолчанию Многопоточность и прогресс

Здравствуйте я пишу менеджер закачек на курсовую и использую такой вариант скачивания:
Код:
function GetInetFile(const fileURL, FileName: string): boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: file;
  sAppName: string;
begin
  Result:=False;
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName),
  INTERNET_OPEN_TYPE_PRECONFIG,
  nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession,PChar(fileURL),nil,0,0,0);
    try
      AssignFile(f, FileName);
      Rewrite(f,1);
      repeat
        InternetReadFile(hURL, @Buffer,
        SizeOf(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen)
      until
        BufferLen = 0;
      CloseFile(f);
      Result:=True;
    finally
      InternetCloseHandle(hURL)
    end;
  finally
    InternetCloseHandle(hSession)
  end;
end;
Эта функция реализована через wininet.
с прогрессом загрузки разобрался через HTTPQueryINFO.
А вот как сделать многопоточную закачку***

Последний раз редактировалось Horus92; 22.05.2010 в 18:59.
Horus92 вне форума Ответить с цитированием
Старый 22.05.2010, 22:21   #2
Horus92
Форумчанин
 
Аватар для Horus92
 
Регистрация: 04.05.2009
Сообщений: 147
По умолчанию

Натолкните хотя бы на мысль как реализовать многопоточность то что я пока понял это получать range из http и как -то через него скачивать кусок файла.
Horus92 вне форума Ответить с цитированием
Старый 22.05.2010, 22:46   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как минимум TThread используйте + синхронизацию(сообщения отменно подходят)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.05.2010, 07:39   #4
Horus92
Форумчанин
 
Аватар для Horus92
 
Регистрация: 04.05.2009
Сообщений: 147
По умолчанию

Пока вот что вышло это обычное скачивание. В данный момент тут TThread сделан для паузы закачки так как закачка вешала форму.
Кнопка запуска:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var FileOnNet, LocalFileName: string; b:real;
NewThread: TNewThread;
begin
 NewThread:=TNewThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower;
  NewThread.Resume;
end;
Тело потока:
Код:
procedure TNewThread.Execute;
var FileOnNet, LocalFileName: string; b:real;
begin

  FileOnNet:=form1.Edit1.text;
  LocalFileName:='save.mp3';

  if GetInetFile(FileOnNet, LocalFileName,form1.PBar1) = true then
    ShowMessage('Download successful')
  else
    ShowMessage('Error in file download');
    end;
Функция скачивания файла:
Код:
function GetInetFile(const fileURL, FileName: string;Pbar:Tprogressbar): boolean;             //Скачивание
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: file;
  fsize,tmpsz,sp,pp:integer;
  sAppName: string;

begin
  Result:=False;
  fsize:=GetUrlSize(fileURL);
  tmpsz:=0;
  sp:=fsize div 100; // Вычисляем цену деления progressbar
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName),
  INTERNET_OPEN_TYPE_PRECONFIG,
  nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession,PChar(fileURL),nil,0,0,0);
    try
      AssignFile(f, FileName);
      Rewrite(f,1);
      repeat
      if pause then //обработка нажатия паузы
      repeat
      until not pause else
        begin
          InternetReadFile(hURL, @Buffer,
          SizeOf(Buffer), BufferLen);
          BlockWrite(f, Buffer, BufferLen);
          tmpsz:=tmpsz+BufferLen;
          pp:=tmpsz div sp;  //Получаем сколько % скачано
          if pp>100
          then pp:=0;
          Pbar.Position:=pp;
          form1.Label1.Caption:=inttostr(pp)+' %';
          end;
      until
        BufferLen = 0;
      CloseFile(f);
      Result:=True;
    finally
      InternetCloseHandle(hURL)
    end;
  finally
    InternetCloseHandle(hSession)
  end;
end;
Horus92 вне форума Ответить с цитированием
Старый 23.05.2010, 14:15   #5
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Horus92, ваш поток рабочий должен быть синхронизирован с главным потоком. Феникс правильно вам подсказал, используйте PostMessage(<объект кому надо отправить>, <сообщение(обычно резервируется как константа с уникальным идентификатором)>, WParam, LParam);
А сам поток поставьте в критическую секцию, или используйте мьютексы.
А для того, чтобы обработать сообщение для объекта, нужно написать процедуру обработки:
Код:
... в типе формы в привате пишите
procedure TakeMsg(Var msg:Tmessage); message <ваша константа>;
...
procedure TakeMsg(Var msg:Tmessage);
begin
<тут выполняете нужную вам работу>
end;
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 23.05.2010, 16:42   #6
Horus92
Форумчанин
 
Аватар для Horus92
 
Регистрация: 04.05.2009
Сообщений: 147
По умолчанию

А что даст синхронизация? и как она вобще выполняется.
И помогите все же как мне примерно реализовать алгоритм многопоточности а то у меня есть однопоточная загрузка через функцию указанную выше а многопоточность я понял реализуется сза счет скачивания файла несколькими потоками с разных мест определенный кусок и потом соединение воедино.
Так как видоизменить мою функцию для скачивания файла с определнного места??
Horus92 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Вопрос] Как определить прогресс таймера? ZARO Помощь студентам 13 12.03.2010 06:23
Многопоточность. newmister Общие вопросы Delphi 9 24.07.2009 12:54
список и прогресс бар Temka Общие вопросы Delphi 1 02.06.2009 12:20
После нажатия старт идёт типа прогресс и отправляет скачать полную версию программы aminov Фриланс 13 28.07.2008 16:34
Прогресс закачки mish666 Работа с сетью в Delphi 7 21.01.2008 15:50