Скачать изображение
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы| Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Скачать изображение
|
Сообщ.
#1
,
|
|
|
|
Нужно скачать изображение по УРЛ и передать скаченную матрицу в TImage.
Пытался скачать изображение вот так: ![]() ![]() procedure TDownloader.Load; var I:TidHTTP; S:TMemoryStream; JPEG: TJPEGImage; begin i:=TIdHTTP.Create(nil); S:=TMemoryStream.Create; JPEG:=TJPEGImage.Create; try I.Get(URL,S); S.Position:=0; Jpeg.LoadFromStream(S); Image.Picture.Assign(JPeg); finally i.Free; S.Free; JPeg.Free; end; end; Но даже в потоке ,такой код тормозит перерисовку всей формы.Как быть? |
|
Сообщ.
#2
,
|
|
|
|
1) Что-бы загрузка не тормозила перерисовку, перерисовка должна быть отделена от загрузки.
Подсказка хранить картинку надо в TBitmap; 2) Что-бы загрузка не тор мазила не надо каждый раз устанавливать TCP и HTTP соединения. Держи их открытыми. Тот же принцип отдели загрузку от создания соединения. Добавлено PS. Есть предположение что и загрузка сделана с ошибкой странно что работает. |
|
Сообщ.
#3
,
|
|
|
|
Нужно во главе потока грузить.. Execute; а не в отдельных его процедурках типа .Load;....
тогда ни чего не будет тормозить.. |
|
Сообщ.
#4
,
|
|
|
|
faust777,
Естественно, ![]() ![]() TDownloader = class(TThread) |
|
Сообщ.
#5
,
|
|
|
|
Protector
чтобы развеять сомнения faust777, покажи, откуда вызывается метод Load |
|
Сообщ.
#6
,
|
|
|
|
Цитата Pavia @ PS. Есть предположение что и загрузка сделана с ошибкой странно что работает. ![]() ![]() procedure TDownloader.Load; var I:TidHTTP; S:TMemoryStream; JPEG: TJPEGImage; begin i:=TIdHTTP.Create(nil); S:=TMemoryStream.Create; JPEG:=TJPEGImage.Create; try try I.Get(URL,S); except end; S.Write(Pointer(S)^, SizeOf(S)); S.Position:=0; Jpeg.LoadFromStream(S); try if Assigned(Image)and(@Image<>nil)and(not Self.Terminated) then begin Image.Picture.Assign(Jpeg); end; except end; finally i.Free; S.Free; JPeg.Free; end; end; Добавлено MBo, Каким образом корректно обработать ситуацию ,когда поток еще грузит картинку ,а юзер завершает приложение? У меня такая последовательность действий вызывает AV и Еврика показывает утечку памяти (i:=TIdHTTP.Create(nil); - здесь ). |
|
Сообщ.
#7
,
|
|
|
|
Всё не смотрел, но на будущее не помешает подумать, чему равно SizeOf(S)? (TMemoryStream)
И что должна делать волшебная строка? S.Write(Pointer(S)^, SizeOf(S)); для чего @Image<>nil ? |
|
Сообщ.
#8
,
|
|
|
|
Апдейт:
![]() ![]() procedure TDownloader.Execute; var I:TidHTTP; S:TMemoryStream; JPEG: TJPEGImage; begin inherited; i:=TIdHTTP.Create(nil); S:=TMemoryStream.Create; JPEG:=TJPEGImage.Create; try try I.Get(URL,S); except end; S.Position:=0; Jpeg.LoadFromStream(S); try Image.Picture.Assign(Jpeg); except end; finally i.Free; S.Free; JPeg.Free; end; end; А в чем причина утечки памяти? |
|
Сообщ.
#9
,
|
|
|
|
![]() ![]() Image.Picture.Assign(Jpeg); это как у тебя "поток" определяет Где находиться Image?А в общем, как то так).. ![]() ![]() type TForm1 = class(TForm) Button1: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TDownloader = class(TThread) private HTTP:TidHTTP; JPEG: TJPEGImage; procedure EndDown; protected procedure Execute; override; public constructor Create(CreateSuspended: Boolean); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin TDownloader.Create(False); end; constructor TDownloader.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); end; procedure TDownloader.Execute; var S:TMemoryStream; begin HTTP:= TIdHTTP.Create(nil); S:= TMemoryStream.Create; JPEG:=TJPEGImage.Create; try HTTP.Get('http://forum.sources.ru/uploads/av-150083.jpg',S); S.Position:=0; JPEG.LoadFromStream(S); Synchronize(EndDown); except FreeAndNil(S); FreeAndNil(HTTP); JPeg.Free; end; if Assigned(S) then FreeAndNil(S); if Assigned(JPEG) then JPEG.Free; if Assigned(HTTP) then FreeAndNil(HTTP); end; procedure TDownloader.EndDown; begin Form1.Image1.Picture.Assign(JPEG); end; |
|
Сообщ.
#10
,
|
|
|
|
Цитата faust777 @ ![]() ![]() Image.Picture.Assign(Jpeg); это как у тебя "поток" определяет Где находиться Image?А в общем, как то так).. ![]() ![]() type TForm1 = class(TForm) Button1: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TDownloader = class(TThread) private HTTP:TidHTTP; JPEG: TJPEGImage; procedure EndDown; protected procedure Execute; override; public constructor Create(CreateSuspended: Boolean); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin TDownloader.Create(False); end; constructor TDownloader.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); end; procedure TDownloader.Execute; var S:TMemoryStream; begin HTTP:= TIdHTTP.Create(nil); S:= TMemoryStream.Create; JPEG:=TJPEGImage.Create; try HTTP.Get('http://forum.sources.ru/uploads/av-150083.jpg',S); S.Position:=0; JPEG.LoadFromStream(S); Synchronize(EndDown); except FreeAndNil(S); FreeAndNil(HTTP); JPeg.Free; end; if Assigned(S) then FreeAndNil(S); if Assigned(JPEG) then JPEG.Free; if Assigned(HTTP) then FreeAndNil(HTTP); end; procedure TDownloader.EndDown; begin Form1.Image1.Picture.Assign(JPEG); end; Каждую с n картинок ,загружает отдельный поток .Зачем синхронизация? |
|
Сообщ.
#11
,
|
|
|
|
для VCL например)
А уж чего там каждую или как..извени..не телепат. Вот это ты что показал? ![]() ![]() S.Position:=0; Jpeg.LoadFromStream(S); try Image.Picture.Assign(Jpeg); except end; finally i.Free; Такое в принципе не может работать. компилятор это даже запустить не даст.. Давай тогда больше когда своего, а не не понятные обрывки. |
|
Сообщ.
#12
,
|
|
|
|
faust777,
![]() ![]() constructor TDownloader.Create(const URL: string; var Img: TImage); begin inherited Create(false); Self.Url:=URL; Self.Image:=Img; Self.FreeOnTerminate:=true; end; Это весь код . Добавлено Цитата faust777 @ компилятор это даже запустить не даст.. Не утрируйте .Все работает ,корректно пока не наступает описанная ситуация . |
|
Сообщ.
#13
,
|
|
|
|
Цитата faust777 @ except FreeAndNil(S); FreeAndNil(HTTP); JPeg.Free; end; if Assigned(S) then FreeAndNil(S); if Assigned(JPEG) then JPEG.Free; if Assigned(HTTP) then FreeAndNil(HTTP); end; Если написать вместо except слово finally, то можно обойтись одним экземпляром удалений ресурсов. Единственный ньюанс - ожидается ли подавление исключений? Или это такой side-effect? |
|
Сообщ.
#14
,
|
|
|
|
Цитата Mr.Delphist @ Если написать вместо except слово finally, то можно обо.... Тут уж кому как) да и тема не про то..вроде).. Щас то в чём уже проблема.. ведь очевидно что зависаний ни каких нет.. А утечки..Без них Indy наверно ни когда не будет... Насколько критично это, вот в чём вопрос.. Или как вариант ещё, сделать своё "закрытие программы"... что бы когда "юзер завершает приложение", всё остановливалось..очищалось.. |
|
Сообщ.
#15
,
|
|
|
|
Цитата Protector @ Это весь код . Цитата Protector @ А в чем причина утечки памяти? Деструктор потока покажи. |