我正在尝试生成一个Qt应用程序,该应用程序能够处理来自Stdin的消息,而不会阻塞事件循环。我最终意识到,Stdin上的QSocketNotifier在Windows上不起作用,所以我只能看到QWinEventNotifier,它初始化为QWinEventNotifier(GetStdHandle(STD_INPUT_HANDLE),this)
。
不幸的是,无论是否存在任何标准输入数据,此通知程序都会不断发出其激活信号。连续发出信号会对CPU使用率和事件循环造成灾难性的后果。我该怎么办?
此外,在连接通知程序激活信号的插槽内,在调用读取操作之前,我还无法找到一种方法来检查可用数据。从技术上讲,如果信号可靠地表明有数据可用,这将是多余的,但我很好奇。调用任何类型的读取操作(无论是通过QTextStream还是通过Std方法)都会导致程序无限期挂起,直到写入数据为止。我曾尝试检查诸如QTextStream.atEnd()
,Std::cin.eof()
,Std::cin.rdbuf()->in_avail()
之类的东西,但这些似乎都与实际可用数据无关。