Win32 - 从标准输入读取超时

2024-01-08

我正在尝试做一些我认为应该很简单的事情:从标准输入进行阻塞读取,但如果没有可用数据,则在指定的时间间隔后超时。

在 Unix 世界中这很简单select()但这在 Windows 中不起作用,因为stdin不是插座。不创建额外线程等的下一个最简单的选项是什么?

我正在使用针对 Win32 环境的 Visual C++。

到目前为止我已经尝试过:

  1. using select(如果输入不是套接字则不起作用)

  2. using WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE))。 - 雷米的第一个建议。如果标准输入是控制台,那么当您调用它时,这似乎总是立即返回(其他人报告了相同的问题)

  3. 使用重叠 IO 并执行WaitForSingleObject(雷米的第三个建议)。在这种情况下,当输入来自控制台时,读取似乎总是被阻止 - 看起来stdin不支持异步I/O。

目前,我认为我唯一剩下的选择是创建一个线程,该线程将执行阻塞读取,然后发出事件信号,然后让另一个线程等待超时事件。


我必须解决类似的问题。在 Windows 上,它不像 Linux 那样简单或明显。然而,这是可能的。诀窍在于 Windows 将控制台事件放入控制台输入事件队列中。您必须过滤掉您不关心的事件,并仅处理您确实关心的事件(例如按键)。

进一步阅读:请参阅 Win32 控制台文档 http://msdn.microsoft.com/en-us/library/windows/desktop/ms686971%28v=vs.85%29.aspx

以下是我正在研究的基于套接字和标准输入多路复用器的一些主要调试的示例代码:

void ProcessStdin(void)
{
    INPUT_RECORD record;
    DWORD numRead;
    if(!ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &record, 1, &numRead)) {
        // hmm handle this error somehow...
        return;
    }

    if(record.EventType != KEY_EVENT) {
        // don't care about other console events
        return;
    }

    if(!record.Event.KeyEvent.bKeyDown) {
        // really only care about keydown
        return;
    }

    // if you're setup for ASCII, process this:
    //record.Event.KeyEvent.uChar.AsciiChar

} // end ProcessStdin

int main(char argc, char* argv[])
{
    HANDLE eventHandles[] = {
        GetStdHandle(STD_INPUT_HANDLE)
        // ... add more handles and/or sockets here
        };

    DWORD result = WSAWaitForMultipleEvents(sizeof(eventHandles)/sizeof(eventHandle[0]), 
        &eventHandles[0], 
        FALSE, 
        1000, 
        TRUE
        );

    switch(result) {
        case WSA_WAIT_TIMEOUT: // no I/O going on right now
            break;

        case WSA_WAIT_EVENT_0 + 0: // stdin at array index 0
            ProcessStdin();
            break;

        case WSA_WAIT_EVENT_0 + 1: // handle/socket at array index 1
            break;

        case WSA_WAIT_EVENT_0 + 2: // ... and so on
            break;

        default: // handle the other possible conditions
            break;
    } // end switch result
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Win32 - 从标准输入读取超时 的相关文章

  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • 实体框架代码优先 - 在另一个文件中配置

    使用 Fluent API 将表到实体的映射分开的最佳方法是什么 以便它全部位于单独的类中 而不是内联在 OnModelCreating 方法中 我目前在做什么 public class FooContext DbContext prote
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • C中有const吗?

    这个问题可能很幼稚 但是 有没有constC 中的关键字 从哪个版本开始 之间有任何语义和 或句法差异吗const在 C 和 C 中 C 和 C 之间在语法上没有差异const关键字 除了一个相当晦涩的关键字 在 C 中 自 C99 起 您
  • glDrawElements 只绘制半个四边形

    这是我的功能 void Object draw2 if mIsInitialised return Tell OpenGL about our vertex and normal data glEnableClientState GL VE
  • 成员初始值设定项列表中的求值顺序是什么?

    我有一个带有一些参数的构造函数 我假设它们是按照列出的顺序初始化的 但在一种情况下 它们似乎是按相反的顺序初始化的 导致中止 当我反转参数时 程序停止中止 下面是我正在使用的语法的示例 a 之前需要初始化b 在这种情况下 你能保证这个初始化
  • 通过 mpi 发送 c++ std::vector

    我知道存储一个std vector
  • C#:使用 System.Text 和 System.Text.RegularExpressions 之间的区别

    在 ASP NET C 应用程序中 我注意到为了使用 Regex 和 StringBuilder 我必须将两者都放在 using System Text using System Text RegularExpressions 从简单的角度
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • _mm_max_ss 在 clang 和 gcc 之间有不同的行为

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • 为什么 C 函数不能返回数组类型?

    我是 C 语言新手 想知道 为什么 C 函数不能返回数组类型 我知道数组名是数组第一个值的地址 而数组是 C 中的二等公民 您自己已经回答了这个问题 数组是二等公民 C 按值返回 数组不能按值传递 因此不能返回它们 至于为什么数组不能按值传
  • 如何在 C++ 中使用 PI 常数

    我想在一些 C 程序中使用 PI 常数和三角函数 我得到三角函数include
  • 通过 MSBuild 调用 cl.exe 时无限期挂起

    我正在尝试在我的 主要是 C 项目上运行 MSBuild 想象一下一个非常庞大的代码库 Visual Studio 2015 是有问题的工具集 Windows 7 SP1 和 VS 2015 更新 2 即使使用 m 1 从而迫使它仅使用一个
  • 为什么我不能在扩展 List 的类中调用 OrderBy?

    我有一堂课 Deck 其中包含一个名为的方法Shuffle 我正在致力于重构Deck延长List
  • C# - 为什么我需要初始化 [Out] 参数

    我有几个从本机 dll 导入的方法 使用以下语法 internal static class DllClass DllImport Example dll EntryPoint ExampleFunction public static e
  • 如何使用 g++ 在 c++ 20 中使用模块?

    我读了这个链接https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules并尝试从该网站复制以下示例 我已经知道这个编译器部分支持模块系统 注 我用的是windo
  • Windows 上 libcurl 的静态库[重复]

    这个问题在这里已经有答案了 如何将此库 libcurl 静态链接到 exe 我努力了 disable share enable static 没有帮助 我使用的是MingW32 有没有一种简单的方法来静态链接这个库 这样我的应用程序就不再有

随机推荐

  • Gsettigs 和 dconf 设置热键

    Hello 我需要在 ubuntu 12 10 中设置一个热键 我使用 gsettings dconf gsettings set org gnome settings daemon plugins media keys custom ke
  • 使用 WinSCard 库获取 mifare 卡序列号

    我正在开发一个需要读取 Mifare 卡序列号的应用程序 我使用的语言是 C 我是 mifare 读卡器编程的新手 所以很抱歉问了愚蠢的问题 首先我想知道Mifare UID和Mifare序列号是否有不同 我已经在 WinSCard 库的帮
  • Objective-C 中强弱的区别

    两者有什么区别strong and weak in property对象指针的声明 另外 什么是nonatomic mean 考虑气球方面的强引用和弱引用可能会有所帮助 只要至少有一个人抓住气球上的一根绳子 气球就不会飞走 持有字符串的人数
  • 获取 30 天前的日期和时间

    我想计算从现在 例如 14 月 30 日 23 06 到 30 天前 例如 14 月 1 日 23 06 的 php 过去 30 天时间段 我写了这篇文章 其中当前日期时间在 d1 中 过去 30 天的日期时间在 d2 中 但不知何故我没有
  • 整数到字节的转换

    假设我有一个整数 13941412 我希望将其分成字节 该数字实际上是 0x00bbggrr 形式的颜色 你会怎么做 在 c 中 您可以将数字转换为 BYTE 然后移动位 Python 中如何转换为字节 使用按位数学运算符 字节 已经存在
  • Spark的HiveContext内部是如何工作的?

    我是 Spark 新手 我发现使用HiveContext我们可以连接到hive并运行HiveQLs 我运行它并且它起作用了 我的疑问是Spark做到了spark jobs 也就是说 它使用HiveContext仅用于从HDFS访问相应的hi
  • 使用 Gulp 读取、重建和替换文件中的内容块的最有效方法是什么?

    我正在创建一个可以读取任何文件 php jsp html 等 定位块标签并根据块标签中的信息进行替换的系统 我将写入我的文件的代码 testObject name jonathan number 3 male true 所需更换 h1 Jo
  • 在 Visual Studio 中,我可以在调试时禁用对应用程序进行签名吗?

    在 Visual Studio 的项目属性 gt 签名选项卡中 我已使用代码签名证书对我的项目进行了签名 然而 在我的团队中 我是唯一拥有代码签名证书的人 即使我们处于多开发人员环境中 当其他开发人员尝试 开始调试 时 他们会收到以下消息
  • 编译错误 - Groovy 和 Lombok

    这是我的 Maven 命令 mvn clean compile test compile test for 这个项目 https github com prystasj lombok groovy example 但我面临着 错误 不再有标
  • 打开自定义 UITableViewCell 时在溢出菜单中显示/隐藏辅助功能元素

    我正在自定义中实现辅助功能UITableViewCell班级 我有一个相当简单的溢出菜单 里面有几个按钮 这些按钮是隐藏的 直到按下省略号按钮滑动打开并关闭溢出 在我的单元格的初始化程序中 我设置accessibilityElementsH
  • L 系统信息

    我即将启动一个大学项目 为现有项目建造一座程序城市 我想知道你们中是否有人有过编写 L Systems 的经验 并且知道我应该从哪里开始 在使用程序方法 Perlin 噪声和 fBm 之前我已经做了一些工作 所以我得到了分形意义上的 L 系
  • 使用嵌入式 Jetty 提供静态文件

    我正在尝试构建一个带有嵌入式 Jetty 的简单演示应用程序 该应用程序从 html 目录 当前工作目录的子目录 提供静态文件 这个想法是 包含演示 jar 和内容的目录可以移动到新位置并且仍然可以工作 我已经尝试过以下变体 但我不断收到
  • Dart 编辑器和 SDK(解压下载后)通常安装/移动到的文件夹是什么?

    Dart 编辑器和 SDK 解压下载后 通常安装 移动到的文件夹是什么 Applications 请遵循https dart dev get dart https dart dev get dart brew tap dart lang d
  • 查找活动的参加者

    我正在尝试显示 公共 谷歌日历中的事件 我的要求是获取与会者的数量 不一定是与会者的姓名 但是 当我使用日历 API 使用 API 密钥和 CalendarID 获取事件时 该活动缺少提到的整个与会者部分here https develop
  • grep R中列表内向量的精确匹配

    我有一个这样的列表 map tmp lt list ABC c EGF HIJ c KML ABC IOP SIN KMLLL gt grep ABC map tmp 1 1 3 gt grep ABC map tmp 1 1 by usi
  • 为什么 SignalProducer 不返回信号?

    我觉得我理解了 ReactiveCocoa 的所有基本组件 概念上 通过理解如何将所有部分连接在一起仍然有点令人困惑 例如 在阅读了有关 Signal 的内容后 我完全期望 SignalProducer 只有一个返回 Signal 的 st
  • apple/swift 中的 Swift 函数对象包装器

    看完之后 https github com rodionovd SWRoute wiki Function hooking in Swift https github com rodionovd SWRoute wiki Function
  • 自定义 ViewCell Xamarin Tableview C# 中的按钮

    再次期待您的帮助 我试图让最右侧的按钮能够删除表视图控件中的行 现在他们现在知道他们在哪一行 但我无法将此信息连接到父级 表视图中填充有自定义视单元 自定义视图单元格包含两个不同的选择器 两个输入字段和一个按钮 我还没有找到更干净的方法来执
  • NSFileManager 创建目录错误 518 NSFileWriteUnsupportedSchemeError

    我试图创建一个目录 NSError error nil NSString BIDirectory NSSearchPathForDirectoriesInDomains NSCachesDirectory NSUserDomainMask
  • Win32 - 从标准输入读取超时

    我正在尝试做一些我认为应该很简单的事情 从标准输入进行阻塞读取 但如果没有可用数据 则在指定的时间间隔后超时 在 Unix 世界中这很简单select 但这在 Windows 中不起作用 因为stdin不是插座 不创建额外线程等的下一个最简