问题标签 [cancelio]

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 回答
634 浏览

windows - CancelIo() 对已经读取的字节做了什么?

如果我ReadFile()10 个字节(在没有超时的重叠模式下)但CancelIo()在读取 5 个字节后调用会发生什么?的文档CancelIo()说它取消了任何挂起的 I/O,但是已经读取的 5 个字节会发生什么?他们迷路了吗?他们是否重新排队,所以下次ReadFile()我会再次获得他们?

我正在寻找说明一种或另一种方式的规范。我不想依赖经验证据。

0 投票
4 回答
4456 浏览

windows - 如何找出 CancelIo() 何时完成?

CancelIo()应该取消与调用线程相关的所有挂起的 I/O 操作。根据我的经验,CancelIo() 有时也会取消未来的I/O 操作。鉴于:

  1. CancelIo(port)如果我在读取之前立即调用,GetQueuedCompletionStatus()将永远阻塞,永远不会收到读取操作。
  2. CancelIo(port)如果我在读取后立即调用,GetQueuedCompletionStatus()将返回 0GetLastError()==ERROR_OPERATION_ABORTED
  3. 如果我调用CancelIo(port)并且没有挂起或后续读取,GetQueuedCompletionStatus()将永远阻塞。

这里的关键点是无法检测何时CancelIo()完成执行。如何确保CancelIo()已完成执行并且发出进一步的读取请求是安全的?

PS:查看http://osdir.com/ml/lib.boost.asio.user/2008-02/msg00074.htmlhttp://www.boost.org/doc/libs/1_44_0/doc/html/ boost_asio/using.html听起来 CancelIo() 并不是真的可用。必须客户需要 Windows XP 支持。我有哪些选择?

注意:我正在从串行端口读取。

0 投票
4 回答
1119 浏览

winapi - 如果 CancelIo 失败怎么办?

调用的原因有很多CancelIo,但在我的特殊情况下,我调用它是为了知道系统不再写入缓冲区。一旦知道这一点,我就可以安全地释放缓冲区。

但是如果CancelIo失败了怎么办?我现在要做的是显式泄漏缓冲区并抛出异常。有没有更好的方法来处理这个问题?

PS 对 Europa、Ganymede 和 Callisto 的类似调用似乎不见了。我应该提交错误吗?

0 投票
1 回答
446 浏览

c# - 为什么 CancelIo 函数失败?

我写了下面的代码。我正在调用此方法以使用三个单独的线程写入三个不同的硬盘。CancelIo 调用之一失败(返回 false)。

我假设磁盘没问题(硬件没问题)。

怎么会这样?

(更换磁盘后,我看到它在另一个磁盘上再次发生。)

0 投票
1 回答
776 浏览

visual-c++ - win32 api 中缺少函数 CancelIO() 和 GetOverlappedResult()

我找不到函数 CancelIo 和 GetOverlappedResult

函数 CancelIO 描述为 CancelIO 函数取消调用线程为指定文件句柄发出的所有挂起的输入和输出 (I/O) 操作。该函数不会取消其他线程为文件句柄发出的 I/O 操作。

函数 GetOverlappedResult 被描述为检索对指定文件、命名管道或通信设备的重叠操作的结果。指定超时间隔或等待可警报线程。

它们没有在 windows.h 中定义。我在哪里可以找到它们的头文件?还是有等效功能可以代替它们?

0 投票
1 回答
483 浏览

c++ - CancelIoEx : 函数指针 typedef

以下代码是从 MS Async Filter 复制而来的。假设以下代码正在调用 CancelIo 或 CancelIoEx。无论如何,我看不到在哪里调用 CancelIoEx。假设 typedef 代表 CancelIoEx 但从未被调用。这条线到底在bResult = (pfnCancelIoEx)(m_hFile, NULL);做什么?