|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
В потоке не выполняется действие
Здравствуйте. Вот незатейливый код.
Код:
procedure TgetJpg1Thread.Execute; var Stream: TMemoryStream; IdHTTP: TIdHTTP; s_url: String; // Sender: TObject; bmp: TBItmap; jpg: TJpegImage; begin Stream := TMemoryStream.Create(); jpg := TJpegImage.Create; bmp := TBitmap.Create; Try IdHTTP := TIdHTTP.Create(NIL); s_url := 'подставить урл'; IdHTTP.ReadTimeout := 500; IdHTTP.ConnectTimeout := 500; IdHTTP.HTTPOptions := [hoInProcessAuth]; IdHTTP.Get(s_url, Stream); if stream.Size > 0 then begin Stream.SaveToFile('1.jpg'); // Stream.Position := 0; jpg.Loadfromfile('1.jpg'); bmp.Assign(jpg); SetStretchBltMode(Form1.Image1.Canvas.Handle, HALFTONE); Form1.Image1.Canvas.CopyRect(Form1.Image1.Canvas.ClipRect, bmp.Canvas, bmp.Canvas.ClipRect); Form1.Image1.Picture.SaveToFile('333.jpg'); end; IdHTTP.Disconnect; IdHTTP.Free; FreeAndNil(Stream); FreeAndNil(bmp); FreeAndNil(jpg); Except On E: Exception do begin IdHTTP.Disconnect; IdHTTP.Free; FreeAndNil(Stream); FreeAndNil(bmp); FreeAndNil(jpg); end; end; end; Смысл его в том, что он скачивает картинку из интернета и меняет её размер в соответствии с размером компонента TImage. Из обычной кнопки код корректно выполняется полностью. А если подставить этот код в Execute потока, то не отрабатывает строка: Код:
Form1.Image1.Canvas.CopyRect(Form1.Image1.Canvas.ClipRect, bmp.Canvas, bmp.Canvas.ClipRect); |
#2
|
|||
|
|||
Добавь синхронизацию твоего потока с главным потоком приложения.
|
#3
|
|||
|
|||
Цитата:
Synchronize(myProcedure); а в myProcedure вставить проблемную строку, и myProcedure выполнится в основном потоке? Но почему эта строка не работает в доп.потоке... вот в чём вопрос... Последний раз редактировалось svshamov, 12.05.2021 в 12:14. |
#4
|
|||
|
|||
Да, именно так.
Если правильно помню, то там заморочки с памятью между потоками. |