Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

### Проблема с заморозкой системы в Delphi при работе с потоком TThread и преобразованием Bitmap в JPEG ###

Delphi , Компоненты и Классы , Потоки

Вопрос пользователя связан с проблемой заморозки системы во время работы с потоком TThread в среде разработки Delphi, при преобразовании изображения в формат JPEG и последующей его кодировке в Base64 строку. Проблема возникает, когда пользователь пытается выполнить операции с изображением в отдельном потоке, в то время как в главном потоке программы все работает исправно.

Подробности проблемы

Пользователь написал две функции: ScreenShot для создания скриншота и Base64FromBitmap для преобразования скриншота в JPEG и его кодировки в Base64 строку. При вызове этих функций в потоке TThread происходит зависание системы, из-за чего компьютер становится неработоспособным.

Контекст

Контекстом является код, предоставленный пользователем, где используется класс TThread для выполнения операций с изображением в фоновом потоке. Ключевой момент, вызывающий проблему, находится в функции Base64FromBitmap, где происходит сохранение TJPEGImage в поток с помощью метода SaveToStream.

Решение проблемы

Проблема заключается в небезопасности использования TJPEGImage в многопоточной среде. Для решения проблемы необходимо синхронизировать доступ к объекту TJPEGImage с главным потоком. Также в коде пользователя присутствуют утечки памяти, так как объекты JpegImg и bmp не освобождаются.

Пример решения

В примере кода, предоставленном в качестве подтвержденного ответа, показано, как можно синхронизировать доступ к объекту TJPEGImage с помощью метода Synchronize. Также исправлены утечки памяти: объекты JpegImg и bmp теперь корректно освобождаются.

procedure TEvReader.ScreenShot(DestBitmap: TBitmap);
var
  DC: HDC;
begin
  DC := GetDC(GetDesktopWindow);
  DestBitmap.Canvas.Lock;
  try
    DestBitmap.Width := GetDeviceCaps(DC, HORZRES);
    DestBitmap.Height := GetDeviceCaps(DC, VERTRES);
    BitBlt(DestBitmap.Canvas.Handle, 0, 0, DestBitmap.Width, DestBitmap.Height, DC, 0, 0, SRCCOPY);
  finally
    DestBitmap.Canvas.Unlock;
    ReleaseDC(GetDesktopWindow, DC);
  end;
end;

function TEvReader.Base64FromBitmap(Bitmap: TBitmap): string;
var
  Input: TBytesStream;
  Output: TStringStream;
  JpegImg: TJPEGImage;
begin
  Input := TBytesStream.Create;
  try
    JpegImg := TJPEGImage.Create;
    try
      TThread.Synchronize(nil,
        procedure
        begin
          JpegImg.Assign(Bitmap);
          JpegImg.SaveToStream(Input);
        end);
    finally
      JpegImg.Free;
    end;
    Input.Position := 0;
    Output := TStringStream.Create('', TEncoding.ASCII);
    try
      Soap.EncdDecd.EncodeStream(Input, Output);
      Result := Output.DataString;
    finally
      Output.Free;
    end;
  finally
    Input.Free;
  end;
end;

procedure TOutThread.Execute;
var
  mObj: TEvReader;
  bmp: TBitmap;
  strrr: string;
begin
  mObj := TEvReader.Create;
  bmp := TBitmap.Create;
  try
    mObj.ScreenShot(bmp);
    strrr := mObj.Base64FromBitmap(bmp);
  finally
    bmp.Free;
    mObj.Free;
  end;
  Synchronize(nil,
    procedure
    begin
      Form2.Memo4.Text := strrr;
    end);
end;

Альтернативные подходы

В комментариях обсуждаются альтернативные подходы, такие как использование GDI+ и создание совместимого контекста устройства, а также создание битмапа. Также упоминается, что более безопасным и надежным решением может быть использование сторонней библиотеки для работы с JPEG.

Заключение

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

Создано по материалам из источника по ссылке.

Пользователь столкнулся с проблемой заморозки системы при работе с потоком `TThread` в Delphi, связанной с преобразованием изображения в формат JPEG и кодировкой в Base64, что происходит из-за некорректного использования многопоточности и утечек памяти.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Потоки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 13:56:14/0.0035297870635986/0