Использование перекрывающейся структуры для обратного вызова?

У меня есть собственная перекрывающаяся структура для асинхронного ввода-вывода с использованием портов завершения ввода-вывода.

Теперь я получаю уведомление о завершении чтения/записи. Могу ли я передать функцию CALLBACK в качестве параметра в перекрывающейся структуре?

Это позволит мне указать различные функции обратного вызова в зависимости от типа перекрывающейся структуры, которую я передал.

Кому-нибудь повезло с этим?


person Desert Ice    schedule 05.10.2013    source источник
comment
Перекрывающаяся структура почти всегда расширяется для включения данных, определенных реализацией. Я не вижу причин, по которым вы не могли бы поместить туда и указатель на функцию обратного вызова. Обратите внимание, однако, что циклы GetQueueCompeletionStatus часто достаточно сложны, и передача базовых данных в CB может не принести вам многого (но я определенно вижу, как это может исключить switch или разыменование таблицы перехода из цикла).   -  person WhozCraig    schedule 05.10.2013


Ответы (1)


Создайте свою собственную структуру, производную от OVERLAPPED:

struct MyOverlapped : OVERLAPPED
{
  CALLBACK MyCallback;
};

Теперь используйте это вместо этого:

MyOverlapped *o=new MyOverlapped;
o->MyCallback=CallbackHandler;

WriteFile(..,..,MyOverlapped);

Затем, когда вы вернете OVERLAPPED, вы можете преобразовать его в свою производную версию:

MyOverlapped *o=static_cast<MyOverlapped*>(overlapped);

И теперь вы можете получить доступ к обратному вызову. Я предполагаю, что вы возвращаете экземпляр OVERLAPPED из вызова GetQueuedCompletionStatus, где указатель, который вы возвращаете, фактически указывает на вашу производную структуру.

person Sean    schedule 22.11.2013