Некоторые особенности при работе с QUEUE

Все прекрасно знают, как работать с очередями используя ключевые поля.
Типа:

Add(Queue,+QUE:Field1,-QUE:Field2)
Put(Queue,+QUE:Field1,-QUE:Field2)
Get(Queue,+QUE:Field1,-QUE:Field2)
Sort(Queue,+QUE:Field1,-QUE:Field2)

Есть еще форма использования данных операторов с ключевой строкой, где задаются внешние имена полей (аттрибут NAME()). Но к данной теме эта форма не имеет отношения.

Но! Довольно часто было бы неплохо задавать в качестве ключевых полей их номера в структуре записи очереди. Стандартные операторы такого не позволяют, но можно использовать для этого их внутренние представления, которые как раз и работают с номерами полей.

MAP
  MODULE('ClaRTL')
    QUE::Add(QUEUE _Que,LONG _F1=0,LONG _F2=0,LONG _F3=0,LONG _F4=0,LONG |
    _F5=0,LONG _F6=0,LONG _F7=0,LONG _F8=0,LONG _F9=0,LONG _F10=0,LONG=0) |
    ,RAW,C,NAME('Cla$ADDqueuekey')
    QUE::Put(QUEUE _Que,LONG _F1=0,LONG _F2=0,LONG _F3=0,LONG _F4=0,LONG |
    _F5=0,LONG _F6=0,LONG _F7=0,LONG _F8=0,LONG _F9=0,LONG _F10=0,LONG=0), |
    RAW,C,NAME('Cla$PUTqueuekey')
    QUE::Get(QUEUE _Que,LONG _F1=0,LONG _F2=0,LONG _F3=0,LONG _F4=0,LONG |
    _F5=0,LONG _F6=0,LONG _F7=0,LONG _F8=0,LONG _F9=0,LONG _F10=0,LONG=0), |
    RAW,C,NAME('Cla$GETqueuekey')
    QUE::Sort(QUEUE _Que,LONG _F1=0,LONG _F2=0,LONG _F3=0,LONG _F4=0,LONG |
    _F5=0,LONG _F6=0,LONG _F7=0,LONG _F8=0,LONG _F9=0,LONG _F10=0,LONG=0), |
    RAW,C,NAME('Cla$SORTqueuekey')
    QUE::Kill(QUEUE _Que),RAW,NAME('Cla$FREEqueue')
  END
END

В принципе, можно задать и больше или меньше параметров в декларации этих процедур. Здесь надо исходить из того, что все (и пустые) параметры перед вызовом процедуры «забрасываются» в стек. Поэтому, если задать слишком много параметров, вызов может занять некоторое время. В любом случае декларировать эти процедуры следует так, чтобы при любом вызове всегда оставался последний «нулевой» параметр, т.к. «нулевой» параметр является для данных процедур признаком завершения списка активных параметров.

QUE::Sort(Queue,1,-2) - Sort(Queue,+QUE:Field1,-QUE:Field2)

Последняя процедура QUE::Kill() может быть полезна при использовании большого кол-ва очередей. Как известно, при первом же обращении к очереди, для данной очереди создается блок служебных параметров размером ~1Kb. Данный блок освобождается ТОЛЬКО при завершении программы или при уничтожении очереди, если она была создана динамически через New(). Не существует других легальных способов освободить память, выделенную под этот служебный блок. Так вот данная процедура (QUE::Kill) позволяет как раз сделать это совершенно легально. Надо, также, иметь ввиду, что после применения данной процедуры ничего не мешает использовать эту очередь в дальнейшем. При следующем же обращении к этой очереди служебный блок будет создан заново. Другими словами, процедура QUE::Kill позволяет как бы эмулировать процесс создания-удаления динамических очередей операторами New()-Dispose().