Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2017, 23:31   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос Как проверить, что адрес метода более недоступен?

Здравствуйте,

как проверить что метод по адресу (объекта) более недоступен?

Грубо говоря есть код:
Код:
function TCustomLogStorage.WriteEntry(Entry: TLogEntry): Boolean;
var
  bDropThis: Boolean;
  i: Integer;
begin
  Result := False;

  for i := 0 to fOnWrite.Count - 1 do
  begin
    bDropThis := False;
    if Assigned(fOnWrite.Subscription[i]) then
    begin
      try
        fOnWrite.Subscription[i](Entry, bDropThis);
      except
        //The requested addr can not be called, note this item as nil
        // and no more avaliable
        fOnWrite.Subscription[i] := nil;
      end;
      if bDropThis then
      begin
        FreeAndNil(Entry);
        exit;
      end;
    end;
  end;
  if fInMemory then
    Add(Entry);
  Result := True;
end;
Где fOnWrite - класс реализующий механизм подписки на событие,
когда 1 событие слушает толпа подписчиков.
Беда в том, что если подписчик, не отпишет слушатель, и умрет (Free, FreeAndNil), то адрес метода будет по прежнему формально жив, но при обращении к нему, программа логично вылетит с AV в трубу. Хотельсь бы как-то не заморачиваться с заботой об освобождении подписоты, и просто игнорировать битые ссылки.


Ещё один момент, вместо списка указателей, у меня список самих процедур:
Код:
type
  TWriteEventProc = procedure(Event: TLogEntry; var DropEvent: Boolean) of object;
  pWriteEventProc = ^TWriteEventProc;
  TWriteEventNotify = TSubscription<TWriteEventProc>;
Может в этом дело?

Assigned и <> nil - не предлагать, не работает.

Пока что ничего интереснее чем залепить пустую try except - не придумал.
Работает конечно, однако думаю, что это не решение проблемы, а костыль

Последний раз редактировалось Человек_Борща; 05.06.2017 в 23:35.
Человек_Борща вне форума Ответить с цитированием
Старый 06.06.2017, 01:32   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вместо массива указателей на методы держать массив указателей на объекты. Сами объекты должны уведомлять перед разрушением этот fOnWrite о своей кончине, что бы он позаботился например о сбросе в nil элемента массива. Тогда и Assigned заработает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проверить, что не так с TCP Krasi Общие вопросы .NET 1 18.01.2016 18:14
Как лучше проверить адрес E-mail на правильность? Leximus Общие вопросы Delphi 26 13.05.2012 08:43
Как передать адрес метода из dll в приложение и присвоить его событию OnClick? puga555 Общие вопросы Delphi 1 22.12.2009 17:04
Получить адрес метода Altera Общие вопросы Delphi 2 02.10.2009 13:43
Адрес метода класса? VintProg Общие вопросы Delphi 6 27.09.2009 13:10