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

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

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

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

Сообщение Alex2013 » 10.02.2025 00:53:03

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

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

Сообщение RRYTY » 10.02.2025 01:16:55

Круто!
RRYTY
постоялец
 
Сообщения: 221
Зарегистрирован: 25.12.2021 10:00:32

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

Сообщение Alex2013 » 10.02.2025 02:09:51

Рад что развлек ... :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
Alex2013
долгожитель
 
Сообщения: 3100
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Ichthyander » 10.02.2025 19:42:54

Alex2013 писал(а):(правда там https не читает через fphttpclient

Прокомментирую только это: очень похоже на то, что не установлены (или не добавлены в соответствующую папку) 64 битные библиотеки OpenSSL. То есть установлены 32-битные. Нужно именно 64 битные установить
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 689
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение Alex2013 » 10.02.2025 21:59:10

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 13:32:12, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3100
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Alex2013 » 12.02.2025 13:23:20

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

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

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

Тест загрузки списка 2
Многопоточный
Время 4,34 c


(То что было в ролике немного "обмани зрения" из за не точного отслеживания момента завершения "крайнего потока" + второй вариант "однопоточности" вынес в отдельную процедуру бо оказывается, что даже ожидание завершения работы потока для каждого элемента сбивает расчет времени "ускоряя" загрузку)
Зы
Отличие первого и второго вариантов теста в том, что в первом я "многопоточно" подготавливаю данные которые потом использую "однопоточно" , а во втором все операции по созданию и "вклейке" элемента в мозаику выполняются в внутри потока ( что надежнее и быстрее ).
Alex2013
долгожитель
 
Сообщения: 3100
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru