草庐IT

ReadFileEx

全部标签

c++ - 我可以精确地时间重叠 ReadFileEx 操作吗?

我正在使用ReadFileEx从文件中读取扇区对齐的block(使用CreateFile和FILE_FLAG_NO_BUFFERING标志打开),记录调用前的开始时间和完成例程中的结束时间(来自QueryPerformanceCounter的时间)。无论整个文件的大小如何,我的block读取大小都是恒定的。block偏移量按顺序排队,因此ReadFileEx始终读取文件中比上一个点更远的点。我注意到一些奇怪的行为,例如较小的文件记录的block读取时间明显快于较大的文件。在这种情况下,较大文件的大小是较小文件的两倍-我不应该期望这在原始数据读取级别上很重要,因为无论如何我正在读取相同大

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

我正在编写一个类(PipeReader)来处理Windows上的命名管道。该类使用异步IO从管道读取。到目前为止,我一直在没有事件循环的线程中使用该类,我不得不等待IO完成使用SleepEx()并且它起作用了。现在我有第二个带有事件循环的线程和PipeReader类的第二个实例,但是从未调用第二个实例的完成例程。调用CreateFile():handle=CreateFile(fullServerName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);调用ReadFileEx():B

windows - 如何判断 ReadFileEx() 重叠 I/O 何时完成?

HasOverlappedIoCompleted()不适用于以ReadFileEx()开头的异步I/O和WriteFileEx().底部的代码片段演示了这一点。在此示例中,ReadFileEx()从没有输入的管道中读取数据,因此读取不会完成。但是HasOverlappedIoCompleted()返回TRUE。如果我将调用更改为重叠的ReadFile(),则HasOverlappedIoCompleted()会按预期返回FALSE。我的问题是:如何在不依赖回调本身的情况下,找出带有回调的重叠I/O请求是否已完成?在我的应用程序中,APC可能已经排队,但不一定已经运行,因为应用程序可能尚

windows - 如何为 ReadFileEx() 的完成例程提供上下文信息?

Win32ReadFileEx定义为:BOOLWINAPIReadFileEx(__inHANDLEhFile,__out_optLPVOIDlpBuffer,__inDWORDnNumberOfBytesToRead,__inoutLPOVERLAPPEDlpOverlapped,__in_optLPOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine);我正在尝试弄清楚如何使完成例程(最后一个参数)在操作完成时调用动态函数指针。似乎没有办法传递用户数据。有什么想法吗? 最佳答案 传入R

c++ - 子进程重定向的 STDOUT 上的重叠 ReadFileEx 永远不会触发

我有一个长期运行的基于控制台的应用程序Sender,它使用非缓冲输出(例如cout我问了一个separatequestion关于执行此操作的最佳方法。我的第一次尝试是为子进程创建具有重定向STDIN和STDOUT的管道,并使用异步ReadFileEx调用来读取Sender的数据。这无法正常工作,因为ReadFileEx函数仅触发一次,并且仅传输零字节,即使我知道Sender正在发送数据也是如此。我正在使用重定向的STDIN和STDOUT创建2个管道,alathisMSexample://allowthechildprocesstoinherithandlesSECURITY_ATTRI