【问题标题】:Using overlapped structure for callback?使用重叠结构进行回调?
【发布时间】:2013-10-05 04:40:33
【问题描述】:

我有自己的重叠结构,用于使用 IO 完成端口的异步 IO。

现在我收到关于读/写完成的通知。我可以在重叠结构中将 CALLBACK 函数作为参数传递吗?

这将允许我根据我传递的重叠结构的类型指定各种回调函数

有人遇到过这种情况吗?

【问题讨论】:

  • 重叠结构几乎总是扩展为包含实现定义的数据。我看不出你为什么不能在其中填充回调函数指针。但是请注意,GetQueueCompeletionStatus 循环通常足够复杂,将基础数据推送到 CB 可能不会给您带来太多收益(但我当然可以看到它如何消除循环中的 switch 或跳转表取消引用)。跨度>

标签: c++ windows asynchronous overlapped-io io-completion-ports


【解决方案1】:

创建您自己的源自OVERLAPPED 的结构:

struct MyOverlapped : OVERLAPPED
{
  CALLBACK MyCallback;
};

现在改用这个:

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

WriteFile(..,..,MyOverlapped);

然后,当您返回 OVERLAPPED 时,您可以将其转换为您的派生版本:

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

现在您可以访问回调了。我猜你是从对GetQueuedCompletionStatus 的调用中返回OVERLAPPED 实例,你返回的指针实际上将指向你的派生结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多