Что за ошибка ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Что за ошибка ?

Сообщение Alex2013 »

Добился того что внутри программы все более менее работает но при закрытии вываливается что-то такое ...
(Да это довольно старая версия лазаруса но в принципе вполне рабочая )
Изображение :idea:
Зы
Пересобрал 64-х разрядную версию там такого дампа нет .
(правда там https не читает через fphttpclient )
Последний раз редактировалось Alex2013 10.02.2025 00:46:01, всего редактировалось 2 раза.
RRYTY
постоялец
Сообщения: 253
Зарегистрирован: 25.12.2021 09:00:32

Сообщение RRYTY »

Круто!
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Рад что развлек ... :wink: Но в чем дело то ? (fphttpclient кстати в 64-биитной версии "подает признаки жизни" но через раз (dll заменил ) )
(Разумеется есть 1500 вариантов замены fphttpclient-та так что вопрос тут не в нем )
Зы
Честно говоря подобных чудовищ ЕГГОЛогии я довольно давно не встречал
Зы Зы
Грешу на "не деактивированное" исключение не совсем верно обработанное внутри потока.
(Транспарант вываливается не каждый раз а после длительного тестирования с многократным повторением цикла чтения с диска )
"Подозрительную" Функцию уже выкладывал ...
(По сути она одна крутится в потоке "за пределами синхронизации" разумеется можно синхронизировать и операции с файлом но это по идее резко снизит "многопоточное ускорение" )

Код: Выделить всё

 Const
 CacheMode:boolean=True;
  function LoadAndScaleImage(const URLOrFilePath: string; const TargetWidth, TargetHeight: Integer): TBitmap;
  var
    Bitmap,B: TBitmap;
    JPEGImage: TFPCustomImage;
    HTTPClient: TFPHttpClient;
    CachePath: string;
    CacheFilename: string;
   MST, MemoryStream: TMemoryStream;
       FCanvas : TFPcustomCAnvas ;
   writer : TFPCustomImageWriter;

  begin

    Result := nil;
    Bitmap := TBitmap.Create;
    try
      // Кэширование: проверяем, есть ли файл в кэше
      CachePath := ExtractFilePath( ExpandFileName(ParamStr(0)));
      CacheFilename := CachePath + ExtractFileName(URLOrFilePath);
      JPEGImage := TFPMemoryImage.create(0,0);
      //if ExtractFileExt( URLOrFilePath )<>'jpg' then exit;
      // Загрузка из интернета или файла
      if CacheMode and FileExists(CacheFilename) then
      begin
         JPEGImage.LoadFromFile(CacheFilename);
      end
      else
      begin
        if Pos('http', LowerCase(URLOrFilePath)) = 1 then
        begin
          HTTPClient := TFPHttpClient.Create(nil);
          try
            MemoryStream := TMemoryStream.Create;
            try
              HTTPClient.Get(URLOrFilePath, MemoryStream);
              MemoryStream.Position := 0;
              JPEGImage. LoadFromStream(MemoryStream);
            finally
             MemoryStream.Free;
            end
         except
           FreeAndNil(Bitmap);
           HTTPClient.Free;
           exit;
           end;

     HTTPClient.Free;

        end
        else
        begin
         // Bitmap
           JPEGImage.LoadFromFile(URLOrFilePath);
        end;

        // Сохраняем в кэш
       if Pos('http', LowerCase(URLOrFilePath)) = 1 then
       JPEGImage.SaveToFile(CacheFilename);
      end;


  Bitmap.SetSize(TargetWidth, TargetHeight);
  B := Bitmap;
  //Конверсия  в Bitmap
      FCanvas := TFPImageCanvas.Create (JPEGImage);
        Writer := TFPWriterBMP.Create;
        MST:=TMemoryStream.Create;
        Writer.ImageWrite(Mst,JPEGImage);
        Writer.Free;
        MST.Seek(0,soBeginning);
        b.LoadFromStream(MST);
       Mst.Free;
       Bitmap:=ScaleNN(B,TargetWidth, TargetHeight);b.Free;
    //Bitmap.Canvas.StretchDraw( Rect(0,0,TargetWidth-1, TargetHeight-1),B);
        FCanvas .Free;
      except
       FreeAndNil(Bitmap);
      end;
         JPEGImage.Free;
        Result := Bitmap;
  end;
Зы Зы Зы
Проверил "синхронизацию" записи/чтения это не помогает .
----------------------------
"Вывернул на изнанку" и поставил в начале очистку списка

Код: Выделить всё

Const 
L:Tlist=nil;
...
Begin     
...
if L=Nil then L:=Tlist.Create
else
For I:=0 to L.Count-1 do
  TBitmap(L[I]).Free;

Вроде помогло...
( Фиича в том что "явно многопоточная " часть программы смешивается с "неявно многопоточной" )

Добавлено спустя 4 часа 1 минуту 14 секунд:
"Многопоточное ускорение " кстати весьма заметное даже с "надежной синхронизацией"(съедает примерно секунду) ...
Тест загрузки списка
Однопоточный
Время 15,60 c
Тест загрузки списка
Многопоточный
Время 4,84 c
Для сетевой загрузи разница еще больше ...
Тест загрузки списка
Однопоточный
Время 27,69 c
Тест загрузки списка
Многопоточный
Время 4,40 c
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Alex2013 писал(а):(правда там https не читает через fphttpclient
Прокомментирую только это: очень похоже на то, что не установлены (или не добавлены в соответствующую папку) 64 битные библиотеки OpenSSL. То есть установлены 32-битные. Нужно именно 64 битные установить
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Ichthyander писал(а):Прокомментирую только это: очень похоже на то, что не установлены (или не добавлены в соответствующую папку) 64 битные библиотеки OpenSSL. То есть установлены 32-битные. Нужно именно 64 битные установить
Ну спасибо и на том ... :idea:
DLL заменял например попробовал openssl-1.0.2q-x64_86-win64.zip openssl-1.0.2t-x64_86-win64.zip openssl-1.0.2u-x64_86-win64.zip

Добавлено спустя 14 минут 46 секунд:
С ошибкой кстати "разобрался радикально"! Просто переделал функционал потока так что он вообще, не требует "внешней очистки" (сразу читает, раскодирует,масштабирует создает "карточку" и подклеивает ее в "общую мозаику" (получилось даже немного быстрее + есть красивый эффект "ленивой загрузки" и ничего не дергается как было при использовании мозаики из кучи TImage и "полу фабриката" с основой из TListView )

Добавлено спустя 34 минуты 9 секунд:
"Все в одном" общий тест (я надеюсь что когда нибудь из этого теста выйдет очередной "модуль галереи" )
1 Тест одиночной загрузки, масштабирование (не через канвас ) и "клонирование" )
2 "Сетка" тест правильности расчета таблицы
3 "Старый тест" простой(медленно но наглядно ) и многопоточный ( то что мучал вчера )
4 "Новый тест" (Load List 2 ) каждая картинка загружается и обрабатывается внутри отдельного "выделенного" потока не требуя "доработки"
Однопоточный и многопоточный режим + загрузка из сети ( отключение CacheMode )
https://youtu.be/IztN4COZumQ
Последний раз редактировалось Alex2013 12.02.2025 12:32:12, всего редактировалось 1 раз.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Вообщем на самом деле правильный лог выглядит так .
Тест загрузки списка 1
Однопоточный
Время 18,13 c

Тест загрузки списка 1
Многопоточный
Время 6,00 c
Тест загрузки списка 2
Однопоточный
Время 12,56 с

Тест загрузки списка 2
Многопоточный
Время 4,34 c
(То что было в ролике немного "обмани зрения" из за не точного отслеживания момента завершения "крайнего потока" + второй вариант "однопоточности" вынес в отдельную процедуру бо оказывается, что даже ожидание завершения работы потока для каждого элемента сбивает расчет времени "ускоряя" загрузку)
Зы
Отличие первого и второго вариантов теста в том, что в первом я "многопоточно" подготавливаю данные которые потом использую "однопоточно" , а во втором все операции по созданию и "вклейке" элемента в мозаику выполняются в внутри потока ( что надежнее и быстрее ).
Ответить