dequeue_messageT_dequeue_messageDequeueMessageDequeueMessage (Operator)

Name

dequeue_messageT_dequeue_messageDequeueMessageDequeueMessage — Empfangen einer oder mehrerer Nachrichten aus einer Warteschlange.

Signatur

dequeue_message( : : QueueHandle, GenParamName, GenParamValue : MessageHandle)

Herror T_dequeue_message(const Htuple QueueHandle, const Htuple GenParamName, const Htuple GenParamValue, Htuple* MessageHandle)

void DequeueMessage(const HTuple& QueueHandle, const HTuple& GenParamName, const HTuple& GenParamValue, HTuple* MessageHandle)

HMessageArray HMessageQueue::DequeueMessage(const HTuple& GenParamName, const HTuple& GenParamValue) const

HMessage HMessageQueue::DequeueMessage(const HString& GenParamName, const HTuple& GenParamValue) const

HMessage HMessageQueue::DequeueMessage(const char* GenParamName, const HTuple& GenParamValue) const

HMessage HMessageQueue::DequeueMessage(const wchar_t* GenParamName, const HTuple& GenParamValue) const   (Nur Windows)

static void HOperatorSet.DequeueMessage(HTuple queueHandle, HTuple genParamName, HTuple genParamValue, out HTuple messageHandle)

HMessage[] HMessageQueue.DequeueMessage(HTuple genParamName, HTuple genParamValue)

HMessage HMessageQueue.DequeueMessage(string genParamName, HTuple genParamValue)

Beschreibung

dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessage empfängt eine Nachricht aus einer Warteschlange die in QueueHandleQueueHandleQueueHandleQueueHandlequeueHandle referenziert ist. Die Nachricht muss zuvor von einem beliebigen Thread mit Hilfe des Operators enqueue_messageenqueue_messageEnqueueMessageEnqueueMessageEnqueueMessage 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_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessage sofort die älteste Nachricht und gibt eine Referenz auf das Nachrichtenobjekt im Parameter MessageHandleMessageHandleMessageHandleMessageHandlemessageHandle 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_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessage 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_messageenqueue_messageEnqueueMessageEnqueueMessageEnqueueMessage eingereiht wurde).

Die Daten, die ein Nachrichtenobjekt enthält können anschließend über die Operatoren get_message_paramget_message_paramGetMessageParamGetMessageParamGetMessageParam, get_message_tupleget_message_tupleGetMessageTupleGetMessageTupleGetMessageTuple oder get_message_objget_message_objGetMessageObjGetMessageObjGetMessageObj abgefragt werden.

Die Nachrichtenobjekte, die man von dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessage erhält, können anschließend wiederverwendet, d.h. modifiziert und/oder in eine weitere Warteschlange eingereiht werden.

Falls mehrere Nachrichtenobjekte über einen einzelnen Aufruf von enqueue_messageenqueue_messageEnqueueMessageEnqueueMessageEnqueueMessage in die Warteschlange eingereiht wurden, werden all diese Nachrichtenobjekte auch wieder zusammen durch einen einzelnen Aufruf von dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessage der Warteschlange entnommen und als Tupel im Parameter MessageHandleMessageHandleMessageHandleMessageHandlemessageHandle 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_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessage auf Nachrichten warten aufzuwecken und die Operation abzubrechen. Dies erreicht man indem man den Operator set_message_queue_paramset_message_queue_paramSetMessageQueueParamSetMessageQueueParamSetMessageQueueParam mit dem Parameter 'abort_dequeuing'"abort_dequeuing""abort_dequeuing""abort_dequeuing""abort_dequeuing" verwendet. In diesem Fall wird der blockierte Operator dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessage sofort mit dem Fehler H_ERR_MQCNCL zurückkehren.

Es ist möglich das Verhalten von dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessage durch die generischen Parameter GenParamNameGenParamNameGenParamNameGenParamNamegenParamName und GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue zu beeinflussen. Aktuell wird nur ein einziger Parameter unterstützt:

'timeout'"timeout""timeout""timeout""timeout":

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'"infinite""infinite""infinite""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.

Ausführungsinformationen

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.

Parameter

QueueHandleQueueHandleQueueHandleQueueHandlequeueHandle (input_control)  message_queue HMessageQueue, HTupleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Warteschlangenobjekt.

Parameteranzahl: QueueHandle == 1

Restriktion: QueueHandle != 0

GenParamNameGenParamNameGenParamNameGenParamNamegenParamName (input_control)  string(-array) HTupleHTupleHtuple (string) (string) (HString) (char*)

Name der generischen Parameter

Parameteranzahl: GenParamName == GenParamValue

Defaultwert: 'timeout' "timeout" "timeout" "timeout" "timeout"

Werteliste: 'timeout'"timeout""timeout""timeout""timeout"

GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue (input_control)  tuple(-array) HTupleHTupleHtuple (string / integer / real) (string / int / long / double) (HString / Hlong / double) (char* / Hlong / double)

Werte der generischen Parameter

Parameteranzahl: GenParamName == GenParamValue

Defaultwert: 'infinite' "infinite" "infinite" "infinite" "infinite"

Werteliste: 'infinite'"infinite""infinite""infinite""infinite"

MessageHandleMessageHandleMessageHandleMessageHandlemessageHandle (output_control)  message(-array) HMessage, HTupleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Entnommene Nachrichtenobjekte.

Parameteranzahl: MessageHandle > 0

Zusicherung: MessageHandle != 0

Beispiel (HDevelop)

create_message_queue (Queue)
* ...
dequeue_message (Queue, [], [], Message)
get_message_obj (Image, Message, 'my_image')

Ergebnis

Im Erfolgsfall gibt dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessage 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.

Nachfolger

get_message_tupleget_message_tupleGetMessageTupleGetMessageTupleGetMessageTuple, get_message_objget_message_objGetMessageObjGetMessageObjGetMessageObj, get_message_paramget_message_paramGetMessageParamGetMessageParamGetMessageParam

Siehe auch

create_message_queuecreate_message_queueCreateMessageQueueCreateMessageQueueCreateMessageQueue, clear_message_queueclear_message_queueClearMessageQueueClearMessageQueueClearMessageQueue, enqueue_messageenqueue_messageEnqueueMessageEnqueueMessageEnqueueMessage, set_message_queue_paramset_message_queue_paramSetMessageQueueParamSetMessageQueueParamSetMessageQueueParam, get_message_queue_paramget_message_queue_paramGetMessageQueueParamGetMessageQueueParamGetMessageQueueParam, create_messagecreate_messageCreateMessageCreateMessageCreateMessage, clear_messageclear_messageClearMessageClearMessageClearMessage, set_message_tupleset_message_tupleSetMessageTupleSetMessageTupleSetMessageTuple, get_message_tupleget_message_tupleGetMessageTupleGetMessageTupleGetMessageTuple, set_message_objset_message_objSetMessageObjSetMessageObjSetMessageObj, get_message_objget_message_objGetMessageObjGetMessageObjGetMessageObj

Modul

Foundation