Почему GetQueuedCompletionStatus () не возвращает тип операции?

GetQueuedCompletionStatus() удаляет уведомление о завершении, но не возвращает тип уведомления (например, уведомление о прочтении, уведомление о записи).

Я отвечаю за отслеживание того, какие операции я инициирую, например, когда я использую WSARecv(), я добавляю флаг в структуру OVERLAPPED, который указывает, что это за операция (читайте в данном случае), и когда я удаляю уведомление из очереди, я читаю этот флаг. Так кто-нибудь знает, почему GetQueuedCompletionStatus() не возвращает тип операции?


person Tom    schedule 25.02.2015    source источник
comment
Потому что вы должны сами следить за этим. Указатель, который вы вернете, - это ваш ключ. Обычно из OVERLAPPED выводят свою собственную структуру для хранения любого дополнительного контекста.   -  person Hans Passant    schedule 25.02.2015
comment
То, чем на самом деле была операция, не касается GQCS. Решать вам. Он должен управляться как таковой (как часть вашего состояния для каждого ввода-вывода, обычно через расширение структуры OVERLAPPED). Программирование IOCP для фактического ввода-вывода (вы также можете использовать их вообще без ввода-вывода) - это в значительной степени стиль программирования в стиле конечного автомата, где вы управляете указанным состоянием.   -  person WhozCraig    schedule 25.02.2015


Ответы (1)


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

Если вы МОЖЕТЕ передать свой собственный отдельный флаг, это фактически не избавит от необходимости передавать дополнительный материал в виде расширенной структуры OVERLAPPED, поскольку в любом случае очень полезно иметь возможность передавать буфер данных и другую информацию вместе с операцией, поэтому один дополнительный флаг вряд ли стоит иметь ... Моим проектам нужно больше, чем нужно вашим проектам, поэтому давайте просто разберемся с методом, который нам предоставили дизайнеры API ...

person Len Holgate    schedule 25.02.2015