| Operatoren |
dequeue_message — Empfangen einer oder mehrerer Nachrichten aus einer Warteschlange.
dequeue_message( : : QueueHandle, GenParamName, GenParamValue : MessageHandle)
dequeue_message empfängt eine Nachricht aus einer Warteschlange die in QueueHandle referenziert ist. Die Nachricht muss zuvor von einem beliebigen Thread mit Hilfe des Operators enqueue_message in die Warteschlange eingereiht worden sein.
Die Nachrichten werden in FIFO (first-in first-out) Reihenfolge empfangen, wobei die Nachrichten unabhängig von der Anzahl der wartenden Threads jeweils nur einmal empfangen werden können. Falls die Warteschlange Nachrichten enthält, entnimmt dequeue_message sofort die älteste Nachricht und gibt eine Referenz auf das Nachrichtenobjekt im Parameter MessageHandle zurück. Der Besitz auf die Nachrichtendaten geht damit von der Warteschlange auf die zurückgegebene Nachrichtenreferenz über.
Falls die Warteschlange leer ist, wartet dequeue_message bis ein Nachrichtenobjekt für die Entnahme aus der Warteschlange verfügbar ist (nachdem sie zuvor von einem anderen Thread in die Warteschlange mit Hilfe von enqueue_message eingereiht wurde).
Die Daten, die ein Nachrichtenobjekt enthält können anschließend über die Operatoren get_message_param, get_message_tuple oder get_message_obj abgefragt werden.
Die Nachrichtenobjekte, die man von dequeue_message erhält, können anschließend wiederverwendet, d.h. modifiziert und/oder in eine weitere Warteschlange eingereiht werden. Wenn das Nachrichtenobjekt nicht mehr benötigt wird, sollten alle Ressourcen der Nachricht, insbesondere der gespeicherten Tupel- und Objektdaten, mit Hilfe des Operators clear_message freigegeben werden.
Falls mehrere Nachrichtenobjekte über einen einzelnen Aufruf von enqueue_message in die Warteschlange eingereiht wurden, werden all diese Nachrichtenobjekte auch wieder zusammen durch einen einzelnen Aufruf von dequeue_message der Warteschlange entnommen und als Tupel im Parameter MessageHandle zurückgegeben.
Der Zugriff auf die Warteschlange ist intern synchronisiert. Es müssen daher keine weiteren Synchronisationsmaßnahmen getroffen werden.
Es kann z.B. während einer Rekonfigurierung oder dem Aufräumen für eine Applikation notwendig werden, Threads die im Operator dequeue_message auf Nachrichten warten aufzuwecken und die Operation abzubrechen. Dies erreicht man indem man den Operator set_message_queue_param mit dem Parameter 'abort_dequeuing' verwendet. In diesem Fall wird der blockierte Operator dequeue_message sofort mit dem Fehler H_ERR_MQCNCL zurückkehren.
Es ist möglich das Verhalten von dequeue_message durch die generischen Parameter GenParamName und GenParamValue zu beeinflussen. Aktuell wird nur ein einziger Parameter unterstützt:
Spezifiziert eine Spanne für eine Zeitüberschreitung, welche bestimmt, wie lange der Operator auf eine Nachricht maximal warten soll, wenn die Warteschlange leer sein sollte. Wenn die Zeitspanne überschritten wurde, kehrt der Operator mit dem Fehler H_ERR_TIMEOUT zurück. Die Spanne für die Zeitüberschreitung kann als Integer- oder Doublewert in Sekunden angegeben werden oder durch den String 'infinite'. Wenn keine Zeitüberschreitung angegeben wurde wird implizit eine unendliche Zeitspanne (infinite) angenommen und der Operator blockiert bis er ein Nachrichtenobjekt aus der Warteschlange entnehmen kann oder die Operation von außen abgebrochen wird.
Dieser Operator liefert ein Handle zurück. Es ist zu beachten, dass der Zustand einer Instanz dieses Handletyps durch bestimmte Operatoren geändert werden kann, obwohl das Handle als Eingabeparameter in diesen Operatoren verwendet wird.
Warteschlangenobjekt.
Parameteranzahl: QueueHandle == 1
Restriktion: QueueHandle != 0
Name der generischen Parameter
Parameteranzahl: GenParamName == GenParamValue
Defaultwert: 'timeout'
Werteliste: 'timeout'
Werte der generischen Parameter
Parameteranzahl: GenParamName == GenParamValue
Defaultwert: 'infinite'
Werteliste: 'infinite'
Entnommene Nachrichtenobjekte.
Parameteranzahl: MessageHandle > 0
Zusicherung: MessageHandle != 0
create_message_queue (Queue) * ... dequeue_message (Queue, [], [], Message) get_message_obj (Image, Message, 'my_image') clear_message (Message)
Im Erfolgsfall gibt dequeue_message den Wert 2 (H_MSG_TRUE) zurück. Andernfalls wird eine Fehlerbehandlung durchgeführt. Mögliche Fehler können durch ungültige Parameter, Zeitüberschreitung (H_ERR_TIMEOUT) oder externes Abbrechen (H_ERR_MQCNCL) verursacht werden. Sollte in seltenen Fällen intern ein Fehler auftreten nachdem die Nachricht bereits aus der Queue genommen wurde, wird der Operator die Nachricht wieder an den Anfang der Warteschlange einreihen. Dies kann zu einer veränderten Reihenfolge der entnommenen Nachrichten führen, Wenn zwischenzeitlich ein anderer Thread eine Nachricht aus der Warteschlange entnommen hat.
get_message_tuple, get_message_obj, get_message_param
create_message_queue, clear_message_queue, enqueue_message, set_message_queue_param, get_message_queue_param, create_message, clear_message, set_message_tuple, get_message_tuple, set_message_obj, get_message_obj
Foundation
| Operatoren |