Перейти к содержанию
Fire Monkey от А до Я
  • 0

Бесконечный цикл при загрузке картинки


Barbanel

Вопрос

Здравствуйте!

Стоит задача загружать фотографии и отображать их в списке. Казалось бы, как два пальца, но...

Код работал долгое время, все грузилось и отображалось. Спустя какое-то время, фото грузиться перестали. Дебаггинг выявил, замкнутый бесконечный цикл в этой процедуре:

procedure TBitmap.AssignFromSurface(const Source: TBitmapSurface);
var
  BitmapData: TBitmapData;
  MaxSize: Integer;
  ResampledSurface: TBitmapSurface;
  I: Integer;
  SourceRect: TRectF;
begin
  MaxSize := CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize); <-- MaxSize = 0
  if (Source.Width > MaxSize) or (Source.Height > MaxSize) then
  begin
    SourceRect := TRectF.Create(0, 0, Source.Width, Source.Height);
    SourceRect.Fit(TRectF.Create(0, 0, MaxSize, MaxSize));
    ResampledSurface := TBitmapSurface.Create;
    try
      ResampledSurface.StretchFrom(Source, Trunc(SourceRect.Width), Trunc(SourceRect.Height), PixelFormat);
      AssignFromSurface(ResampledSurface); <-- infinity loop here
    finally
      ResampledSurface.Free;
    end;
  end
  else
  begin
    SetSize(Source.Width, Source.Height);
    if Map(TMapAccess.Write, BitmapData) then
    try
      for I := 0 to TBitmapSurface(Source).Height - 1 do
        Move(TBitmapSurface(Source).Scanline[I]^, BitmapData.GetScanline(I)^, BitmapData.BytesPerLine);
    finally
      Unmap(BitmapData);
    end;
  end;
end;

В самом начале процедуры MaxSize получает значение 0 (ноль!), размеры картинки больше нуля и процедура влетает в бесконечный цикл на строке

      AssignFromSurface(ResampledSurface);
 

Кто-то сталкивался? Есть мысли как лечить?

Всем спасибо!

Изменено пользователем Barbanel
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
21 минуту назад, Barbanel сказал:

В том-то и дело, что это неосновной поток. Менять не вариант, таково ТЗ.

А зачем менять. Можно же просто засинхронизировать:

TThread.ForceQueue(nil, procedure
  begin
    MaxSize := CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize);
  end);

 

Ссылка на комментарий
  • 0
В 23.06.2017 в 18:31, dnekrasov сказал:

А зачем менять. Можно же просто засинхронизировать:


TThread.ForceQueue(nil, procedure
  begin
    MaxSize := CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize);
  end);

 

ForceQueue не работает под андроидом. 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...