如何检查输入缓冲区是否为空
How can I check whether the input buffer is empty?
我正在尝试编写一个简单的类,用于使用标准窗口库在Windows上操作串行端口。
我需要检查输入缓冲区是否为空。
到目前为止,我已经尝试使用SetCommEvent,使用EV_RXCHAR选项,但是此方法不起作用。该函数似乎在等待新字符的到来。如果我尝试发送 char,睡眠一秒钟并应用它,该函数将不会返回 - 它一直在等待。
bool isEmpty()
{
DWORD dwEventMask = 0;
DWORD Status = 0;
if (CheckAsyncRead())
return false;
if (!SetCommMask(hPort, EV_RXCHAR)) //wait for char receival
std::cout << "Error in creating Overlapped event" << std::endl;
osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (WaitCommEvent(hPort, &dwEventMask, &osReader))
{
//close event handle
return false;
}
Status = WaitForSingleObject(osReader.hEvent, 10);
//I wait for 10 ms in case the function doesn't return immediately
//Close event handle
if (Status == WAIT_OBJECT_0)
{
return false;
}
else
return true;
}
我希望 WaitCommEvent 或 WaitForSingleObject 会在缓冲区中存在任何字符的情况下返回,但如果在接收字符和调用 Wait 函数之间有更长的暂停,则不会发生这种情况。
您可以使用 ClearCommError 函数找出缓冲区中存储的数据的大小。
作为调用的结果,要通知的 COMSTAT 结构的 cbInQue 具有存储在输入缓冲区中的数据的大小。
您可以将 ReadFile(( 与使用 CreateFile(( 打开的句柄一起使用,其中包含 FILE_FLAG_OVERLAPPED 标志。如果 ReadFile(( 函数没有要返回的内容,它将返回最后一个错误ERROR_IO_PENDING这意味着您的缓冲区当前为空。
相关文章:
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 是否可以在 OpenGL 中的同一调用中呈现两个具有不同索引起点的不同缓冲区?
- 是否可以将 std::basic_ifstream 和 std::basic_ofstream 与自定义缓冲区一起使用?
- 是否可以在C++中拼接缓冲区,零拷贝?
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- 输出操纵器 std::ends 是否向输出缓冲区添加空字符?
- 当构建器被销毁时,缓冲区是否有效
- 如何检查输入缓冲区是否为空
- 如何检查 cin 缓冲区是否包含相同的值 0.5 秒 (C++)
- C++如何检查std::cin缓冲区是否为空
- (DirectX 11)单个顶点缓冲区是否可以一次绑定到多个 IA 输入槽
- 在OpenGL中为顶点、uvs和法线使用一个缓冲区是否比使用三个缓冲区性能更好
- CUDA:查明主机缓冲区是否被固定(页面锁定)
- 使用 std::vector 作为简单缓冲区是否是一种好的做法
- 如何确定缓冲区是否已释放
- 对于std::cin缓冲区是否有大小限制?
- 命名管道在c++ Linux检查缓冲区是否已满
- ReadFile缓冲区是否需要被清空?
- 是否有一种方法来检查缓冲区是否在Brotli压缩格式
- 检测声音缓冲区是否充满数据