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

Ответственность за освобождение памяти динамического массива в Delphi

Delphi , ОС и Железо , Справочник по сообщениям

В статье рассматривается вопрос ответственности за освобождение памяти динамического массива в Delphi, созданного с помощью системы HTTORIO. Автор статьи описывает ситуацию, когда в отдельном потоке происходит вызов веб-сервиса, а результаты вызова передаются основной форме. Вопрос заключается в том, кто несет ответственность за освобождение памяти динамического массива и его объектов, созданных системой HTTORIO.

Подтвержденный ответ заключается в том, что TRemotable предоставляет управление жизненным циклом через свойство DataContext, поэтому SOAP-runtime освободит сам объект. Чтобы заявить владение и ответственность за объект, достаточно просто очистить его свойство DataContext. В данном случае, вероятно, вам придется сделать это, так как обработка сообщения API может произойти после завершения SOAP-события.

Однако в коде автора есть проблема: он передает динамический массив через сообщение,PostedMessage. Когда процедура OnTimer возвращается к своему вызывающему объекту, ссылочный счетчик динамического массива, на который ссылается SystemProbeValues, уменьшается. Если другой поток еще не обработал сообщение (а скорее всего, он этого не сделал), то динамический массив может уже быть уничтожен к тому времени, когда он, наконец, дойдет до обработки этого сообщения.

Легкий способ обойти это - очистить ссылку в обработчике события таймера без уменьшения ссылочного счетчика, а затем сделать обратное в обработчике сообщения. После отправки сообщения очистите переменную:

LParam(SystemProbeValues) := 0;

В обработчике сообщения очистите старое значение глобальной переменной ProbeValues и назначьте новое значение следующим образом:

ProbeValues := nil;
LParam(ProbeValues) := Msg.LParam;

Еще одна потенциальная проблема, скрывающаяся в коде автора, связана с использованием TTimer в не-VCL-потоке. Этот класс создает оконный дескриптор для общего использования всеми экземплярами класса. Если ваш таймер-поток не является единственным потоком в программе, использующим TTimer, у вас, скорее всего, возникнут проблемы, либо с функциями, выполняющимися в неправильном потоке, либо с функциями, которые вообще не запускаются. Вместо TTimer вы можете использовать SetTimer, чтобы создать таймер ОС вручную, или создать "ожидаемый" таймер, который может быть более подходящим для использования в потоке, не требующем реакции на пользовательские действия.

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

В статье рассматривается вопрос ответственности за освобождение памяти динамического массива в Delphi, созданного с помощью системы HTTORIO, при передаче данных через несколько потоков, в том числе при использовании TTimer в не-VCL-потоке.


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

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




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


:: Главная :: Справочник по сообщениям ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 10:52:35/0.0053870677947998/1