草庐IT

OVERLAPPED

全部标签

c++ - 等待 COM 端口上的数据?

我正在寻找一种方法让Windows串行端口在接收到数据之前超时。如果有某种事件触发或函数完全按照我的意愿行事,那就太好了。这是我当前的实现。voidwaitforCom(unsingedcharbyte){while(true){ClearCommError(serial_handle,&errors,&status);if(status.cbInQue>0){//checkifcorrectbytebreak;}}} 最佳答案 您可以使用的另一个API调用是WaitCommEvent()。http://msdn.microsoft

windows - OVERLAPPED Win32 结构中的 hEvent 成员

当使用异步I/O(或Win32术语中的“重叠”I/O)时,我们需要处理OVERLAPPED结构和他的hEvent成员。如果I/O函数将延迟读取或写入操作,我们将得到一个ERROR_IO_PENDING错误代码,然后我们将等待异步操作完成一个WaitForXxxEvent函数,然后我们将调用GetOverlappedResult。但是,如果I/O操作立即完成,我们将不会得到ERROR_IO_PENDING,并且在读取操作中,我们的读取缓冲区将立即被填充。但是OVERLAPPED::hEvent成员呢?它会被设置为信号状态吗?我还没有找到关于这一点的明确声明。这个问题可能看起来毫无意义(如

C++ 锁定文件 Windows 阻塞模式

如何使用C++以阻塞方式在Windows上阻塞文件?我所说的阻塞是指......请求锁定,如果文件被锁定,它将等待直到它被解锁,一旦文件被另一个系统进程解锁,然后执行恢复。P.S.:如果有某种跨平台解决方案,我会更喜欢它。 最佳答案 默认情况下,LockFileEx阻塞直到可以获取锁(尽管您可以使用LOCKFILE_FAIL_IMMEDIATELY告诉它不要这样做)。显然这不是跨平台的。更新这个可怕的代码示例说明了它的工作原理(您可能需要将CreateFile中的文件名从“lockBlock.cpp”更改为)。运行该程序的一个实例,

c++ - GetQueuedCompletionStatusEx() 不返回 per-OVERLAPPED 错误代码

我正在使用GetQueuedCompletionStatusEx()api,我刚刚意识到它确实可以在1个系统调用中读取N个OVERLAPPED数据包,而不是只有1个OVERLAPPED,例如GetQueuedCompletionStatus(),但我担心的是我对每个OVERLAPPED错误代码一无所知。虽然GetQueuedCompletionStatus()每次调用仅返回1个OVERLAPPED,但它使我能够调用GetLastError()检查当前OVERLAPPED数据包的最后一个错误.我如何使用GetQueuedCompletionStatusEx()执行此操作,它实际上返回N个

c++ - IO 完成端口和 OVERLAPPED 管理

win32如何在两个函数的上下文中管理OVERLAPPED结构的实例:GetQueuedCompletionStatusPostQueuedCompletionStatus当我调用GetQueuedCompletionStatus时,OVERLAPPED结构的win32自由实例还是我必须自己完成?当我使用PostQueuedCompletionStatus发送数据时,win32是否将其复制到内部结构?我什么时候必须释放已发送数据的内存?我在哪里可以找到有关GetQueuedCompletionStatus、PostQueuedCompletionStatus和IOCP队列之间OVERL

c++ - 如何正确启动进程并转发 stdin/stdout/stderr?

我正在使用CreateProcess启动交互式脚本解释器,并希望透明地从/向解释器转发stdin/stdout/stderr。我的第一次尝试是设置传递给CreateProcess的STARTUPINFO结构STARTUPINFOAsi={sizeof(si)};si.hStdError=::GetStdHandle(STD_ERROR_HANDLE);si.hStdOutput=::GetStdHandle(STD_OUTPUT_HANDLE);si.hStdInput=::GetStdHandle(STD_INPUT_HANDLE);si.dwFlags|=STARTF_USESTD

c++ - ConnectNamedPipe 和 asio overlapped ptr

我命名了使用boostasio编写的管道服务器。服务器创建命名管道并调用ConnectNamedPipe将asiooverlappedptr传递给它。问题是传递给重叠的asio的完成处理程序从未被调用,即在客户端调用CreateFile不会触发传递给ConnectNamedPipe的完成处理程序。我做错了什么?这里是客户端和服务器的完整列表:#define_WIN32_WINNT0x0501#include#include#include#include#include#include#include#include#includestaticconstuint32_tPIPE_OUT

windows - 为什么大块中的文件 I/O 比小块中的文件 I/O 慢?

如果您调用ReadFile一旦大小为32MB,与读取具有较小块大小(如32KB)的等效字节数相比,它花费的时间明显更长。为什么?(不,我的磁盘不忙。)编辑1:忘了说——我正在用FILE_FLAG_NO_BUFFERING做这件事!编辑2:奇怪...我无法再访问我的旧机器(PATA),但是当我在那里测试它时,它花费了大约2倍的时间,有时甚至更多。在我的新机器(SATA)上,我只得到大约25%的差异。这里有一段代码可以测试:#include#include#include#includeintmain(){HANDLEhFile=CreateFile(_T("\\\\.\\C:"),GEN

c++ - WriteFileEx 完成例程成功,但传输的字节数不正确

我使用IO完成例程通过管道在不同机器上的两个进程之间进行通信。有时,当调用WriteFileEx的完成例程时,完成例程参数dwErrorCode为0(即无错误),GetOverlappedResult返回true(即无错误),但dwNumberOfBytesTransfered与WriteFileEx调用中的nNumberOfBytesToWrite不匹配。然而,我只在管道的客户端看到了这一点。如果传输的字节数与请求传输的字节数不匹配,如何才能视为成功?客户端的管道句柄是这样创建的:mHPipe=CreateFile(pipeName,//pipenameGENERIC_READ|//

c++ - IOCP C++ TCP 客户端

我在实现TCPIOCP客户端时遇到了一些问题。我已经在MacOSX上实现了kqueue,所以希望在Windows上做类似的事情,我的理解是IOCP是最接近的东西。主要问题是GetCompetetionStatus永远不会返回并且总是超时。我假设我在创建要监视的句柄时遗漏了一些东西,但不确定是什么。这是我到目前为止的进展:我的连接例程:(为清楚起见,删除了一些错误处理)structsockaddr_inserver;structhostent*hp;SOCKETsckfd;WSADATAwsaData;intiResult=WSAStartup(MAKEWORD(2,2),&wsaDat
12