dequeue_messageT_dequeue_messageDequeueMessageDequeueMessagedequeue_message出队列消息(算子)

名称

dequeue_messageT_dequeue_messageDequeueMessageDequeueMessagedequeue_message — 从消息队列接收一条或多条消息。

签名

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   ( Windows only)

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)

def dequeue_message(queue_handle: HHandle, gen_param_name: MaybeSequence[str], gen_param_value: MaybeSequence[Union[int, float, str]]) -> Sequence[HHandle]

def dequeue_message_s(queue_handle: HHandle, gen_param_name: MaybeSequence[str], gen_param_value: MaybeSequence[Union[int, float, str]]) -> HHandle

描述

dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessagedequeue_message 从由 QueueHandleQueueHandleQueueHandleQueueHandlequeueHandlequeue_handle 参数指定的消息队列中取出一个消息。该消息必须是由任何线程使用 enqueue_messageenqueue_messageEnqueueMessageEnqueueMessageEnqueueMessageenqueue_message 放入队列的。

消息按 FIFO(先入先出)顺序交付,每条消息仅交付一次。如果队列不为空,dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessagedequeue_message 会立即从队列中取出最旧的消息。该消息将从队列中移除,并通过 MessageHandleMessageHandleMessageHandleMessageHandlemessageHandlemessage_handle 输出参数返回该消息的句柄。消息数据的所有权将从消息队列转移(不进行复制)至新创建的消息句柄。

如果队列为空,dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessagedequeue_message 会阻塞,直到有消息可供发送(即由另一个线程使用 enqueue_messageenqueue_messageEnqueueMessageEnqueueMessageEnqueueMessageenqueue_message 放入队列)。

可以通过 get_message_tupleget_message_tupleGetMessageTupleGetMessageTupleGetMessageTupleget_message_tupleget_message_objget_message_objGetMessageObjGetMessageObjGetMessageObjget_message_objget_message_paramget_message_paramGetMessageParamGetMessageParamGetMessageParamget_message_param 查询消息中存储的数据。。

通过 dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessagedequeue_message 获得的消息句柄可以进一步复用(进行修改和/或放入另一个消息队列)。

如果通过单次 enqueue_messageenqueue_messageEnqueueMessageEnqueueMessageEnqueueMessageenqueue_message 调用将多条消息入队,那么所有这些消息也将通过单次 dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessagedequeue_message 调用一起取出,并通过 MessageHandleMessageHandleMessageHandleMessageHandlemessageHandlemessage_handle 元组返回多个消息句柄。

队列访问在内部是完全同步的,无需外部锁定。

在应用程序重新配置或清理过程中,可能需要唤醒在 dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessagedequeue_message 中等待消息的线程。这可以通过 set_message_queue_paramset_message_queue_paramSetMessageQueueParamSetMessageQueueParamSetMessageQueueParamset_message_queue_param 算子配合 'abort_dequeuing'"abort_dequeuing""abort_dequeuing""abort_dequeuing""abort_dequeuing""abort_dequeuing" 参数来实现。在这种情况下,当前被阻塞的 dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessagedequeue_message 调用将立即返回 H_ERR_MQCNCL 错误。

最后,可以通过 GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_nameGenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value 中的泛型参数来调整 dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessagedequeue_message 的行为。目前仅支持一个泛型参数:

'timeout'"timeout""timeout""timeout""timeout""timeout"

超时时间控制算子在队列为空时等待消息的阻塞时长。超时后,算子将返回 H_ERR_TIMEOUT 错误代码。超时时间可以指定为以秒为单位的整数或双精度数值,也可以指定为字符串 'infinite'"infinite""infinite""infinite""infinite""infinite"。若未指定超时时间,则默认使用无限超时,这意味着算子将一直阻塞,直到有新消息入队或操作被中止。

执行信息

此算子返回一个句柄。请注意,即使该句柄被用作特定算子的输入参数,这些算子仍可能改变此句柄类型的实例状态。

参数

QueueHandleQueueHandleQueueHandleQueueHandlequeueHandlequeue_handle (输入控制)  message_queue HMessageQueue, HTupleHHandleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

消息队列句柄。

元素数量: QueueHandle == 1

限制: QueueHandle != 0

GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name (输入控制)  string(-array) HTupleMaybeSequence[str]HTupleHtuple (string) (string) (HString) (char*)

可选泛型参数的名称。

元素数量: GenParamName == GenParamValue

默认值: 'timeout' "timeout" "timeout" "timeout" "timeout" "timeout"

值列表: 'timeout'"timeout""timeout""timeout""timeout""timeout"

GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value (输入控制)  tuple(-array) HTupleMaybeSequence[Union[int, float, str]]HTupleHtuple (string / integer / real) (string / int / long / double) (HString / Hlong / double) (char* / Hlong / double)

可选泛型参数的值。

元素数量: GenParamName == GenParamValue

默认值: 'infinite' "infinite" "infinite" "infinite" "infinite" "infinite"

值列表: 'infinite'"infinite""infinite""infinite""infinite""infinite"

MessageHandleMessageHandleMessageHandleMessageHandlemessageHandlemessage_handle (输出控制)  message(-array) HMessage, HTupleSequence[HHandle]HTupleHtuple (handle) (IntPtr) (HHandle) (handle)

已从队列中取出的消息的句柄。

元素数量: MessageHandle > 0

断言: MessageHandle != 0

示例(HDevelop)

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

结果

如果操作成功,dequeue_messagedequeue_messageDequeueMessageDequeueMessageDequeueMessagedequeue_message 返回 2 (H_MSG_TRUE)。否则将抛出异常。可能的错误情况包括参数无效、消息出队等待超时(H_ERR_TIMEOUT)或消息出队等待中止(H_ERR_MQCNCL)。请注意,在极少数情况下,如果算子调用结束时发生错误(此时消息已从队列中移除),算子会尝试将消息放回队列头部以避免丢失。如果在此期间另一个线程从队列中移除了另一条消息,这可能会导致消息传递顺序发生变化。

可能的后继

get_message_tupleget_message_tupleGetMessageTupleGetMessageTupleGetMessageTupleget_message_tuple, get_message_objget_message_objGetMessageObjGetMessageObjGetMessageObjget_message_obj, get_message_paramget_message_paramGetMessageParamGetMessageParamGetMessageParamget_message_param

另见

create_message_queuecreate_message_queueCreateMessageQueueCreateMessageQueueCreateMessageQueuecreate_message_queue, clear_message_queueclear_message_queueClearMessageQueueClearMessageQueueClearMessageQueueclear_message_queue, enqueue_messageenqueue_messageEnqueueMessageEnqueueMessageEnqueueMessageenqueue_message, set_message_queue_paramset_message_queue_paramSetMessageQueueParamSetMessageQueueParamSetMessageQueueParamset_message_queue_param, get_message_queue_paramget_message_queue_paramGetMessageQueueParamGetMessageQueueParamGetMessageQueueParamget_message_queue_param, create_messagecreate_messageCreateMessageCreateMessageCreateMessagecreate_message, clear_messageclear_messageClearMessageClearMessageClearMessageclear_message, set_message_tupleset_message_tupleSetMessageTupleSetMessageTupleSetMessageTupleset_message_tuple, get_message_tupleget_message_tupleGetMessageTupleGetMessageTupleGetMessageTupleget_message_tuple, set_message_objset_message_objSetMessageObjSetMessageObjSetMessageObjset_message_obj, get_message_objget_message_objGetMessageObjGetMessageObjGetMessageObjget_message_obj

模块

基础