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

Устранение ошибок доступа к памяти в многопоточной среде при использовании `TJson.JsonToObject` в Delphi

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

Устранение ошибок доступа к памяти в многопоточной среде при использовании TJson.JsonToObject<T> в Delphi

Вопрос, поднятый пользователем, связан с возникновением ошибок доступа к памяти при использовании метода TJson.JsonToObject<T> в многопоточной среде. Проблема была выявлена в контексте работы с библиотекой REST.Json от Embarcadero в среде разработки Delphi. Код, вызывающий проблему, представляет собой создание множества потоков, каждый из которых выполняет десериализацию JSON-объекта в объект TParameter.

type
   TParameter = class
   public
      FName     : string;
      FDataType : string;
      FValue    : string;
   end;

procedure Test();
var
   myTasks: array of ITask;
   i : integer;
   max : integer;
begin
   max := 50;
   SetLength(myTasks, max);
   for i := 0 to max - 1 do begin
      myTasks[i] := TTask.Create(procedure ()
         var
            json : string;
            p : TParameter;
         begin
            json := '{"name":"NameOfParam","dataType":"TypeOfParam","value":"ValueOfParam"}';
            p := TJson.JsonToObject<TParameter>(json);
            p.Free;
         end);
      myTasks[i].Start;
   end;
   TTask.WaitForAll(myTasks);
   ShowMessage('all done!');
end;

Ошибки доступа к памяти (random access violations) происходят из-за того, что функция TJson.JsonToObject<T> не предназначена для использования в многопоточной среде. Это связано с внутренними проблемами в RTTI, которые не являются потокобезопасными.

Подтвержденный ответ от пользователя и последующие комментарии указывают на то, что проблема связана с неправильным освобождением ресурсов в методе TJSONUnMarshal.ObjectInstance модуля REST.JsonReflect.pas. После удаления вызова FreeAndNil на экземпляре TRttiType, проблема с ошибками доступа к памяти была устранена.

Пользователь также подчеркивает, что проблема может быть связана с другим багом в системе: https://quality.embarcadero.com/browse/RSP-9815, что может влиять на работу кода.

Для устранения ошибок при использовании TJson.JsonToObject<T> в многопоточной среде, рекомендуется:

  1. Убедиться, что используется последняя версия библиотеки REST.Json, в которой исправлены известные проблемы.
  2. Избегать многопоточного вызова TJson.JsonToObject<T> без синхронизации доступа к ресурсам.
  3. В случае, если проблема сохраняется, следует обратиться в службу поддержки Embarcadero с описанием проблемы и примером кода, вызывающего ошибку.

Также стоит отметить, что использование блокировок вокруг вызова JsonToObject может помочь предотвратить конфликты в многопоточной среде, если другие способы устранения проблемы недоступны или неэффективны.

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

Устранение ошибок доступа к памяти в многопоточной среде при использовании функции `TJson.JsonToObject` в Delphi.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 19:01:55/0.012062072753906/0