Скачать изображение
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы| Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Скачать изображение
|
Сообщ.
#16
,
|
|
|
|
А удалять поток кто будет? Добавлено Я бы сделал так (схематично, некомпилируемо): ![]() ![]() const MSG_IMGGOT = WM_APP + 1; TDownThread.Create(URL: string; ResponseWnd: HWND); begin fURL := URL; fResp := ResponseWnd; inherited Create(False); FreeOnTerminate := True; end; TDownThread.Execute; begin ... Str := GetURL(fURL); ... Img := TJPEG.Create; Img.LoadFromStream(S); ... // free idHTTP, Stream... PostMessage(fResp, MSG_IMGGOT, 0, LPARAM(Img)); end; TForm.Click begin TDownThread.Create('blabla.com/1.jpg', Handle); end; TForm.MsgImgGot(Msg: TMessage); // message MSG_IMGGOT; var Img: TJPEG; begin Img := TJPEG(Msg.lParam); Image1.Assign(Img); Img.Free; end; |
|
Сообщ.
#17
,
|
|
|
|
оно не свалится с ошибкой без синхронизации? я бы эвентом сделал передав через него указатель на картинку и вызвав его в методе с синхронизацией. ну а при создании потока обработчик в форме повесил бы
|
|
Сообщ.
#18
,
|
|
|
|
medved_68,
![]() ![]() destructor TDownloader.Destroy; begin inherited; end; Добавлено Fr0sT, Вот обращение к изображению по хендлу -это ,как по мне, выход . Добавлено Цитата antonn @ ,оно не свалится с ошибкой без синхронизации? Нет |
|
Сообщ.
#19
,
|
|
|
|
Fr0sT,
Следуя вашей идеи : ![]() ![]() procedure TDownloader.Execute; var I:TidHTTP; begin inherited; i:=TIdHTTP.Create(nil); try try I.Get(URL,S); except end; SetImg; finally FreeAndNil(i); end; end; procedure TDownloader.SetImg; var copydata:COPYDATASTRUCT; begin ZeroMemory(@copydata, SizeOf(TCopyDataStruct)); copydata.dwData:=0; copydata.cbData:=S.Size; copydata.lpData:=S.Memory; SendMessage(Self.hCanv,WM_COPYDATA,Longint(Self.hCanv),lparam(@copydata)); end; procedure TForm1.RecvData(var Msg: TWMCopyData); var S:TMemoryStream; J:TJPEGImage; Data: COPYDATASTRUCT; begin Data:=Msg.CopyDataStruct^; S:=TMemoryStream.Create; J:=TJPEGImage.Create; try S.Write(Data.lpData^,Data.cbData); S.Position:=0; J.LoadFromStream(S); Image1.Assign(J); finally S.Free; J.Free; end; end; А изображение передается поврежденным. |
|
Сообщ.
#20
,
|
|
|
|
Цитата antonn @ оно не свалится с ошибкой без синхронизации? C чего бы? Изображение создается в потоке и отправляется форме, после этого в потоке не используется. Таким образом у меня передаются объекты и строки и ничего не валится. Цитата Protector @ Следуя вашей идеи : Нет уж, пардоньте, в моей идее не было ничего от приведенной каши. Начать хотя бы с того, что судя по названию поля hCanv оно содержит хэндл явно не главной формы. А оно должно посылаться именно главной форме. Затем, copydata - на фига? Если уж так не хочется делать true асинхронный способ - пожалуйста, SendMessage(MainFormHandle, MSG_IMGGOT, 0, LPARAM(Img)) будет синхронным (пока форма не обработает сообщение - поток ждет). Также можно передать и мемористрим, без необходимости копировать его. Метод в таком случае сокращается до ![]() ![]() Thread.Execute; begin ...download to stream... SendMessage(MainFormHandle, MSG_IMGGOT, 0, LPARAM(Str)); Str.Free; end; MainForm.MsgImgGot; begin Str := TMemoryStream(Msg.lParam); J.LoadFromStream(S); Image1.Assign(J); J.Free; end; Добавлено Тем не менее, это не ТРУ, и я это посоветовал исключительно в образовательных целях. |
|
Сообщ.
#21
,
|
|
|
|
Fr0sT, результат идентичен .
Добавлено Цитата Fr0sT @ Тем не менее, это не ТРУ, и я это посоветовал исключительно в образовательных целях. А что же трю? |
|
Сообщ.
#22
,
|
|
|
|
Цитата C чего бы? Изображение создается в потоке и отправляется форме, после этого в потоке не используется. Таким образом у меня передаются объекты и строки и ничего не валится. я никогда так не делал и не разбирался, но думал что в сообщении придет указатель на объект созданный в потоке |
|
Сообщ.
#23
,
|
|
|
|
Цитата Protector @ medved_68, CollapsedWrap disabledLine numbers off destructor TDownloader.Destroy; begin inherited; end; А. Тогда вопросов нет. Особенно в разрезе: |
|
Сообщ.
#24
,
|
|
|
|
medved_68,Это локальная переменная .
|
|
Сообщ.
#25
,
|
|
|
|
Вопрос для Protector
Цитата Protector @ medved_68,Это локальная переменная . А напомни, где выделяется память для объектов на стеке или в куче? И когда он освобождается? |
|
Сообщ.
#26
,
|
|
|
|
Pavia,
![]() ![]() 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; |
|
Сообщ.
#27
,
|
|
|
|
Цитата Pavia @ И когда он освобождается? Цитата Protector @ finally i.Free; //Вот где . Как там по жанру должно быть? А...Вопросов не имею...Так? |
|
Сообщ.
#28
,
|
|
|
|
Мне кажется ,сама Еврика вызывает утечку. Чем еще можно проверять утечки памяти?
Добавлено medved_68,По жанру , в этом месте идет оператор case. |
|
Сообщ.
#29
,
|
|
|
|
Protector
http://www.gunsmoker.ru/2009/05/blog-post_24.html Советую при поиске утечки потренироваться на примерах. |
|
Сообщ.
#30
,
|
|
|
|
так все таки в #22 я неправ и через сообщение (не copydata) отправляется полная копия (новый экземпляр) или все таки ссылка (и автору кода пока просто светит удача (например, что объект не уничтожился при завершении потока до того как с ним закончилась работа вне потока))?
|