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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2010, 20:21   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос [Проблема] - Прервать закачку, закрыть поток(tthread) Функция(WinInet)

Всем привет!

Есть вот такая функция у меня:
Код:
procedure HTTPGetFile(const FileURL, FileSaveDest: string; ShowProgress: Boolean; FormHandle: TForm; MsgForm: Cardinal);
const
  BufferSize = 4096; //size of buffer
var
  hSession, hURL: HInternet;
  Buffer: array[0..BufferSize] of Byte;
  BufferLen: LongWord;
  Files: TFileStream;
  Header, pAppName: string;
  LT: Cardinal;
begin
  LT := 0;
  pAppName := 'myApp';
  Header := 'User-Agent: Any';
  hSession := InternetOpen(PChar(pAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hURL := InternetOpenUrl(hSession, PChar(FileURL), PChar(Header), Length(header), 
INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD, 0);

    if (hURL <> nil) then
    begin
      try
        DeleteUrlCacheEntry(PChar(FileURL));
        Files := TFileStream.Create(FileSaveDest, fmCreate);
        repeat
          InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
          Files.WriteBuffer(Buffer, BufferLen);
          if (ShowProgress) then
          begin
            LT := LT + BufferLen;
            SendMessage(FormHandle.Handle, MsgForm, 0, LT + BufferLen);
          end;
        until
          BufferLen = 0;
        FreeAndNil(Files);
      finally
        InternetCloseHandle(hURL);
      end;
    end;
  finally
    InternetCloseHandle(hSession);
  end;
  SendMessage(FormHandle.Handle, MsgForm, 0, 0);
end;
Проблема:
процесс использования этой функции происходит в потоке TThread. По этому я реализовал ещё две кнопки "Пауза/продолжить" и "закрыть".

Собственно независимо от того в каком состоянии находится мой поток(приостановлен или работает) функция продолжае загружать.
Так же если попытаться закрыть поток вызовом Terminate
То поток не закроется пока пака функция не отработает т.е. пака не догрузит файл.

Так приостанавливать загрузку файла одновременно с паузой потока, и возобновлять её с запуском потока, а так же обрывать закачку и закрывать поток если нажато "закрыть"?

Последний раз редактировалось Человек_Борща; 14.12.2010 в 20:23.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Если остановился поток (TThread). Как перезапустить без потери памяти Zuzlan Общие вопросы Delphi 9 01.02.2011 13:57
Пауза/продолжить поток TThread одной кнопкой Человек_Борща Общие вопросы Delphi 3 29.10.2010 00:55
Как оповестить основной поток о каком-то событии в потоке (TThread)? TwiX Общие вопросы Delphi 2 11.02.2010 02:57
Отобразить рабочий поток (TThread) NervniiJ Общие вопросы Delphi 0 10.01.2010 17:34
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50