mrseagull Опубликовано 13 мая, 2016 Поделиться Опубликовано 13 мая, 2016 Во время выполнения иногда происходит загрузка файлов с сервера. Все бы ничего файлы по 20кб просто грузил в потоке и для пользователя это была секунда ожидания. Но встала задача загружать файлы до 4Mb и здесь нужно как-то отобразить процесс. fm->IdHTTP1->Post(L"http:/xxxxxxx.ru/api", s, fs); fs->SaveToFile(dirway + "tmp"); Цитата Ссылка на комментарий
0 Rusland Опубликовано 13 мая, 2016 Поделиться Опубликовано 13 мая, 2016 У IdHTTP есть OnWork, нужно его задействовать. В Windows это было просто... а как под мобильные платформы - вопрос Цитата Ссылка на комментарий
2 bigjorj Опубликовано 13 мая, 2016 Поделиться Опубликовано 13 мая, 2016 (изменено) Вот пример моего потока загрузки Запуск: unit DownloadT; interface uses System.Classes, System.Net.URLClient, System.Net.HttpClient, System.Net.HttpClientComponent, System.SysUtils; type TonDownloadProgress = procedure (Progress:integer) of object; TonDownloadEnd = procedure (FileName:string; Done:boolean; MessageText:string='') of object; TDownloadThread = class(TThread) private IdHTTP1: TNetHTTPClient; fonDownloadProgress:TonDownloadProgress; FonDownloadEnd: TonDownloadEnd; Done: boolean; Max: integer; ProgressValue: integer; procedure ReceiveData(const Sender: TObject; AContentLength:int64; AReadCount:int64; var Abort:boolean); procedure SetonDownloadProgress(const Value: TonDownloadProgress); procedure SetonDownloadEnd(const Value: TonDownloadEnd); protected procedure Execute; override; public url, Status: string; Filename: string; property onDownloadProgress: TonDownloadProgress read FonDownloadProgress write SetonDownloadProgress; property onDownloadEnd: TonDownloadEnd read FonDownloadEnd write SetonDownloadEnd; end; implementation { TDownloadThread } procedure TDownloadThread.Execute; var MyFile: TMemoryStream; begin FreeOnTerminate := true; IdHTTP1 := TNetHTTPClient.Create(nil); MyFile := TMemoryStream.Create(); try IdHTTP1.OnReceiveData := ReceiveData; IdHTTP1.HandleRedirects := true; MyFile.Position := 0; IdHTTP1.Get(url, MyFile); MyFile.SaveToFile(Filename); Done := true; MyFile.Free; IdHTTP1.Free; if Assigned(FonDownloadEnd) then Synchronize(procedure begin FonDownloadEnd(Filename, True); end); except on E:Exception do if Assigned(FonDownloadEnd) then Synchronize(procedure begin FonDownloadEnd(Filename, False, E.Message); end); end; end; procedure TDownloadThread.ReceiveData(const Sender: TObject ; AContentLength:int64 ; AReadCount:int64 ;var Abort:boolean); begin if Terminated then Abort := true else begin Done := false; ProgressValue := AReadCount; if Assigned(fonDownloadProgress) then Synchronize(procedure begin if AContentLength>0 then fonDownloadProgress(Trunc(ProgressValue / AContentLength * 100)) else fonDownloadProgress(0); end); end; end; procedure TDownloadThread.SetonDownloadEnd(const Value: TonDownloadEnd); begin FonDownloadEnd := Value; end; procedure TDownloadThread.SetonDownloadProgress(const Value: TonDownloadProgress); begin FonDownloadProgress := Value; end; end. Запуск: procedure TMainForm.InstallUpdates(aDownloadLink:string); begin DownloadThread:=TDownloadThread.Create(true); DownloadThread.Filename := TPath.Combine(Options.WorkPath,'updates.exe'); DownloadThread.url := aDownloadLink; DownloadThread.onDownloadEnd := OnDownloadEnd; DownloadThread.onDownloadProgress := OnDownloadProgress; DownloadThread.Start; Изменено 13 мая, 2016 пользователем bigjorj Rusland и zairkz 1 1 Цитата Ссылка на комментарий
0 mrseagull Опубликовано 13 мая, 2016 Автор Поделиться Опубликовано 13 мая, 2016 У IdHTTP есть события WorkBegin, WorkEnd, Work; void __fastcall Tfm::IdHTTP1WorkBegin(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCountMax) { fm->pbWait->Max = AWorkCountMax; } //--------------------------------------------------------------------------- void __fastcall Tfm::IdHTTP1WorkEnd(TObject *ASender, TWorkMode AWorkMode) { fm->pbWait->Value = 0; } //--------------------------------------------------------------------------- void __fastcall Tfm::IdHTTP1Work(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCount) { fm->pbWait->Value = AWorkCount; } //------- Цитата Ссылка на комментарий
Вопрос
mrseagull
Во время выполнения иногда происходит загрузка файлов с сервера. Все бы ничего файлы по 20кб просто грузил в потоке и для пользователя это была секунда ожидания. Но встала задача загружать файлы до 4Mb и здесь нужно как-то отобразить процесс.
fm->IdHTTP1->Post(L"http:/xxxxxxx.ru/api", s, fs);
fs->SaveToFile(dirway + "tmp");
Ссылка на комментарий
3 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.