Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.29;
Скачать: CL | DM;

Вниз

Здравствуйте уважаемые мастера, вот имеется достойный вопрос о ср   Найти похожие ветки 

 
Defunct ©   (2004-02-15 21:53) [0]

Здравствуйте уважаемые мастера, вот имеется достойный вопрос о сравнении переменных процедурного типа. Допустим, есть объект TActions, в него поступают и накапливаются в очереди сообщения, которые необходимо выполнить. Формат сообщений примерно такой:
TAction = Record
ExecTime : Real;
FunctionID : TNotifyEvent;
End;

Задача заключается в отлове и удалении повторяющихся сообщений, таких, у которых совпадают ExecTime и владелец функции FunctionID. Если с проверкой ExecTime проблем нет, то при сравнении FunctionID возникает проблема:
@FunctionID указывает на один и тот же метод из таблицы методов класса.

Заполняется FunctionID экземплярами наследников класса TSimpleComponent, у которого есть абстрактный метод StepForward.

TSimpleComponent = class(TComponent, TPersistent)

Constructor Create(AOwner:TActions);Override;
Procedure StepForward(Sender:TObject);virtual;abstract;
Procedure AddToQueue;virtual;

End;


Procedure TSimpleComponent.AddToQueue;
Var Action:TAction;
Begin
If (Owner is TActions) Then
Begin
Action.ExecTime := CurrentTime^ + Delay;
Action.FunctionID := StepForward;
(Owner as TActions).Add( Action );
End;
End;


Несмотря на то, что заполняют поля TAction разные экземпляры наследников TSimpleComponent, @FunctionID всегда равен одному и тому же значению.

Вопрос: как определяется, при вызове FunctionID, который из экземпляров должен отработать?

Я так и не смог найти ответ на этот вопрос, поэтому пришлось изменить структуру передаваемого сообщения на:

TAction = Record
ExecTime : Real;
Sender : TObject;
End;

Хотелось бы вернуться к изначальному варианту. Заранее спасибо за участие в обсуждении.


 
Soft ©   (2004-02-15 22:15) [1]

Попробуй поменять структуру на:

TAction = Record
ExecTime : Real;
FunctionID : TNotifyEvent;
ActionUniqueID:Int64;//уникальный номер акции в системе
End;


ActionUniqueID вычисляется рандомом или от времени+объем памяти+... тоесть мат. ожидание совпадения должно быть очень низким. Далее ActionUniqueID сверяется со всеми в списке чтоб не было совпадений, если есть - перегенирация. Далее запись заносится в структуру.



Страницы: 1 вся ветка

Текущий архив: 2004.02.29;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.048 c
14-94094
DDA
2004-02-05 20:01
2004.02.29
ShareWare Project


9-93749
Micah
2003-08-01 18:55
2004.02.29
Первый крупный проект


1-93897
VID
2004-02-11 14:55
2004.02.29
Как выделить некий текст в TEmbeddedWB ?


1-93842
Вован_
2004-02-16 15:41
2004.02.29
Проблема WaitForSingleObject в отдельном потоке


1-93992
Fridom
2004-02-17 10:27
2004.02.29
Как очистить содержимое папки без её удаления?