问题标签 [overlapped-io]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
295 浏览

c - 如何兼顾 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS、IOCP 和清理

如果FILE_SKIP_COMPLETION_PORT_ON_SUCCESS在绑定到 I/O 完成端口的文件句柄上设置,则OVERLAPPED需要在其 I/O 同步完成时释放结构。否则,它需要保持活动状态,直到工作人员处理来自 I/O 完成端口的通知。

这一切听起来都不错,直到您意识到这仅在您自己管理文件句柄时才有效。
但是如果其他人给了你文件句柄,你怎么知道什么时候应该释放这个OVERLAPPED结构呢?有没有办法在事后发现这一点?
否则,这是否基本上意味着您无法在无法保证完成通知状态的任何文件句柄上正确执行重叠 I/O...?

0 投票
1 回答
299 浏览

visual-c++ - FTDI D2XX 在 USB 电缆断开并重新连接后取消重叠 IO (OIO)

我的应用程序使用基于 USB 的 FTDI 芯片和 D2XX 驱动程序。它使用 OIO(重叠 IO)来读取和写入 USB。我的要求包括 30 秒超时,这是我无法减少的。代码看起来非常健壮和稳定。

一项新要求是克服 USB 电缆的意外断开和重新连接(护士将电缆踢出)。

一旦从 Windows 接收到设备已删除消息并确定它是我们的 FTDI 设备,我发现在前一个 OIO 调用超时(要求的 30 秒超时)之前,我无法从 OIO 重新连接时接收新数据。

一旦我发现断开连接,我会循环执行以下调用,直到所有排队的 OIO 都被收割:

我将超时时间设置为 1 毫秒。这似乎不会更改先前计划的 OIO 的超时。

我打电话FT_W32_PurgeComm取消一切。这似乎也不会取消 OIO。

我尝试调用CancelIo并返回错误,句柄无效。我的理解是由驱动程序代码来响应它。这可能是由于断开连接。

无论如何,我在循环中调用上面的代码,直到所有预定的 OIO 都被收割。30 秒内没有任何反应。然后所有的 OIO 似乎都在不到 1 毫秒的时间内结束。

作为对这段代码的测试,我在连接 USB 电缆的情况下进行了调用,它在 1 毫秒内返回。

因此,问题似乎出在拔下电缆时。

问题:我错过了什么?我还能打其他电话吗?这是一个错误吗?

我尝试过的其他事情:在调用FT_W32_GetOverlappedResult. 这导致快速返回。但我的应用程序无法再从新句柄接收数据。诡异的。有谁知道为什么?

不调用此代码。应用程序能够从新句柄接收新数据,但只能在这些超时之后。为什么?

循环端口。这不会导致这些 OIO 更快地返回。在这些超时之前,它不会改变 OIO 接收数据的使用。

0 投票
0 回答
269 浏览

interop - 互操作、重叠 I/O、句柄:使用 SafeHandle 还是 pin?

当您将非托管句柄(存储在托管端的 IntPtr 或 SafeHandle 中)从托管代码传递到非托管代码以执行重叠 I/O 时,正确的方法是什么?

  • 使用 SafeHandle 将 (IntPtr) 操作系统句柄包装在其中,
  • 或使用 GCHandle.Alloc(IntPtrHandle, GCHandleType.Pinned) 固定它?

我目前正在将 SafeHandle 与 NativeOverlapped 结构结合使用,但我开始越来越怀疑 GC 在内存中移动一个或两个,而不受管理的重叠 IO 正在进行。

我会更好地回到使用 IntPtr 而不是 SafeHandle,并使用 GCHandle 结构来固定它吗?

或者正确的方法是所有的组合,即在你的 NativeOverlapped 中,使用 IntPtr 的固定版本,而 IntPtr 又来自 SafeHandle?

- 编辑

午饭时回想起来,我觉得我很愚蠢。它必须是需要固定的重叠结构,而不是其中的手柄。这是正确的(最佳)答案吗?

0 投票
1 回答
757 浏览

c - Windows 重叠 IO 实际上会阻塞

我正在尝试 Windows 重叠 IO,但我似乎无法让它异步工作。我已经编译并运行了下面的程序,但它从不打印任何东西,它只是默默地完成。我读过小读可以变成同步的,所以我特意选择读512MB。

作为附加信息,我已将代码单步执行到调试器中,并在调用期间Overlapped.InternalHigh更新值(与 相同的值Size) 。ReadFileEx

我尝试用malloc, VirtualAllocwith ReadFileEx, ReadFileadd替换FILE_FLAG_NO_BUFFERING,并检查返回ReadFile0GetLastError是否ERROR_IO_PENDING在读取之后。我尝试使用 RAMMap 来查看文件是否在缓存中,但其中只有 96KB。

我正在运行具有 8GB RAM 的 Windows 10(版本 1703)。

0 投票
0 回答
181 浏览

c++ - Windows 重叠 I/O 和 c++ condition_variable

我有一个X在自己的线程中工作的对象,有时使用(std::condition_variable) some_cv.notify_all().
我还有另一个Y从 Windows 命名管道中执行重叠读取的对象。然后我需要Y等待来自的通知some_cv重叠操作的完成。

我怎样才能做到这一点?我想出的一个解决方案如下:
1)将一个hEvent与重叠操作关联起来。
2)产生一个线程,将等待这个hEvent并调用some_cv.notify_all(). 然后Y应该弄清楚它为什么被唤醒。

然而,这个解决方案需要一个全新的线程,其唯一目的是等待hEvent和“转发信号”到some_cv. 相反,最好使用 执行读取ReadFileEx,为其提供完成例程,然后some_cv.notify_all直接从该例程调用。

问题是这个完成例程只有在Y进入“警报状态”时才有机会运行。而且我不知道std::condition_variable在 Windows 中等待是否可以提醒。

那么std::condition_variable在 Windows 中等待警报是否存在?如果没有,你会建议什么其他方法?

0 投票
2 回答
937 浏览

vb.net - 如何在 VB .Net 中使用带有 WriteFile API 的重叠结构

我使用 VB .Net 调用 Kernel32.dll WriteFile API:

Public Declare Function WriteFile Lib "kernel32" _ ( _ ByVal hFile As IntPtr, _ ByVal lpBuffer As Byte(), _ ByVal nNumberOfBytesToWrite As Int32, _ ByRef lpNumberOfBytesWritten As Int32, _ ByVal lpOverlapped As IntPtr _ ) _ As Boolean

谁能告诉我如何为这个函数创建一个重叠结构(lpOverlapped),以及如何正确传递它(API需要一个指针?)如果可能的话,请显示一个工作代码片段......

我发现的所有信息要么没有显示可用的示例,要么对我来说太复杂而无法理解,或者只是不适用于 VB .Net ...

0 投票
1 回答
858 浏览

c++ - 未调用 ReadFileEx() 完成例程

我正在编写一个类 ( PipeReader) 来处理 Windows 上的命名管道。该类使用异步 IO 从管道中读取。

到目前为止,我一直在没有事件循环的线程中使用该类,我不得不等待 IO 完成使用SleepEx()并且它有效。

现在我有一个带有事件循环的第二个线程和PipeReader该类的第二个实例,但是永远不会调用第二个实例的完成例程。

致电CreateFile()

致电ReadFileEx()

在线程 1 中等待的代码,有效:

线程 2 中从不调用完成例程的事件循环代码:

编辑:

如果我将调用替换为MsgWaitForMultipleObjectsEx()

它仍然不起作用。但是,如果我SleepEx()在事件循环中使用它就可以了。

0 投票
0 回答
78 浏览

c++11 - 无法将 OVERLAPPED 对象传递给 WSAGetOverlappedResult

我正在尝试根据此示例使用重叠 io 来开发 req/res 服务器。
问题是同时可能有多个发送到同一个套接字,我无法将重叠结构传递WSAGetOverlappedResult给正确管理发送事件。主循环如下所示:

然后我将消息从方法发送ManageRead到客户端套接字

当重叠发送完成时,我无法在方法中真正意识到ManageSend哪些重叠结构是通过调用实际发送的WSAGetOverlappedResult

我必须使用WorkerRoutine临时来控制发送,但也许有人知道如何解决这个问题。或者可能有一些不同的方法可以返回已完成的重叠结构?

0 投票
1 回答
270 浏览

sockets - ConnectEx 连接到相同 IP 地址和端口的两个套接字产生重复的 IOCP 事件

我有一个使用 IOCP 进行套接字通信的客户端应用程序。我正在使用 ConnectEx 建立与远程端点的 TCP 连接(在调用 ConnectEx 之前将套接字绑定到 ADDR_ANY 和端口 0)。

与同一个远程端点(相同的 IP 地址和端口号)建立两个连接是有效的。当我使用当前代码测试该条件时,我有两个重叠的 IO 读取操作未完成(每个连接的套接字上一个)来自对 WSARecv() 的调用。每个 WSARecv() 都使用正确的套接字和重叠结构调用。例如:WSARecv(socket1, ...重叠1)和WSARecv(socket2, ...重叠2)。我遇到的问题是,当我从任一遥控器收到响应时,它会触发两个未完成的重叠操作的完成事件。我的代码仅在两个遥控器具有相同的 IP 地址和端口号时才产生此结果,而不是在有两个唯一的远程地址时产生此结果。这是预期的行为(希望不是)?如果是这样,是否有另一种方法来实现这一点?

0 投票
1 回答
146 浏览

visual-c++ - wsasend lpnumberofbytesSent

我在 IOCP 结构化服务器上​​使用 wsasend。有一个问题。

在上面的代码中,我保存了要发送到 wsabuf 的数据包,并通过 wsasend 发送它。最后,我比较了 sendbytes 和 iSendSize 。顺便说一句,sendbytes 和 iSendSize 是不同的。我不知道为什么。