【问题标题】:Writing synchronously to a file opened with FILE_FLAG_OVERLAPPED同步写入使用 FILE_FLAG_OVERLAPPED 打开的文件
【发布时间】:2011-07-12 11:40:00
【问题描述】:

我使用

打开了一个文件
HANDLE handle= 
    CreateFileW(
        fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 
        FILE_FLAG_OVERLAPPED, NULL);

文件句柄随后用于异步读取操作:

ReadFile(handle, buffer, 1, NULL, &overlapped);

这行得通。但是,我现在想做一个同步写入。 WriteFile 文档指出

如果使用 FILE_FLAG_OVERLAPPED 打开 hFile,则以下条件有效:
• lpOverlapped 参数必须指向一个有效且唯一的 OVERLAPPED 结构,否则函数会错误地报告写操作已完成。

当省略lpOverlapepd参数时,ERROR_INVALID_PARAMETERGetLastError()返回。打开两个句柄,一个用于读取,一个用于写入也不起作用,因为第二个句柄会产生ERROR_ACCESS_DENIED 错误。

如何打开文件进行异步读取和同步写入?我不想不必要地增加代码复杂性。

【问题讨论】:

  • 我想使用 I/O 完成端口同时执行其他 I/O 操作到 COM 端口上的操作。

标签: c file asynchronous writefile overlapped-io


【解决方案1】:

可以通过为写入操作创建手动重置事件,写入文件(使用重叠结构中的事件进行写入操作)然后立即等待事件来实现同步写入。

根据您的异步读取是否需要与您的写入异步,您可能需要确保使用兼容的等待,以便可以调用您的读取完成例程,否则读取将发生并且数据将存储在缓冲区,但您无法处理它。

【讨论】:

  • 如果写入阻塞读取完成例程一小段时间是可以的,因为写入不需要太多时间。写入完成后立即处理读取缓冲区,没关系。
【解决方案2】:

打开两个句柄,一个用于异步读取,另一个用于同步写入,只需确保设置文件共享属性(FILE_SHARE_READ|FILE_SHARE_WRITE)。没测试过。

【讨论】:

  • The CreateFile function can create a handle to a communications resource, such as the serial port COM1. For communications resources, the dwCreationDisposition parameter must be OPEN_EXISTING, the dwShareMode parameter must be zero (exclusive access), and the hTemplateFile parameter must be NULL. Read, write, or read/write access can be specified, and the handle can be opened for overlapped I/O. 忘了说 dwShareMode 必须为 0,因为文件句柄是用于通信资源的。
  • 因为我已经处理了 COM 端口,然后我会说你在这两种情况下都坚持使用异步。当 RX buff 中有字符时,创建一个线程等待,并使用主线程进行端口写入(仅当您想要 RS485 时,您必须引入禁止您在读取时写入的锁,这对 RS232 才适用)
  • 另一个建议的答案效果很好:-)应用程序应该尽可能简单,坚持一个线程并按照建议伪造同步写入都是简化它的方法:-)
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
相关资源
最近更新 更多