gpt4 book ai didi

c++ - 使c++不等待用户输入

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:13 26 4
gpt4 key购买 nike

所以,我正在尝试制作一个 c++ WinSock2 chatter,仅供学习之用。这是一个控制台应用程序,我想接受用户输入(用于发送给对方),但我仍然希望能够接收。 (所以你可以写一条消息,同时仍然能够收到一条消息)...

当使用 cin >> 输入时; 程序“暂停”直到用户输入内容,这样它是“基于回合的”(一个用户编写内容并发送,然后另一个用户写一些东西并发送它)。

有没有办法让用户能够在接收内容仍在运行时写一些东西? (最好是多线程以外的东西)

最佳答案

如果缓冲区不为空呢?但是那时代码不会真正具有可移植性,因为我知道您需要进行一些系统调用。参见 this .
但也许你可以用一些 C 代码来完成,我会做一些研究并更新我的答案。

UPD:好的,我做到了。你需要的是select功能。
它可以等到 stdin已经可以阅读了,这就是我们所需要的。但看起来它不适用于 C++ 流,因此您需要仅使用 C 代码进行读取。

让我们跳到定义:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout)

好的,我们只需要检查读取缓冲区,所以 writefdserrorfds可能是 NULL .我们只需要检查 stdin , 所以 nfds1 (fds es 的数量)

超时呢?应该是0 , 所以我们需要初始化变量 struct timeval timeout并通过 timeout.tv_sec = 0 将秒和纳秒设置为 0和 timeout.tv_usec = 0 .

所以,只有readfds左边。这也很简单:我们需要初始化变量,将其“归零”,然后添加 stdin .
可以用 fd_set readfds 来完成, FD_ZERO(&readfds)FD_SET(STDIN_FILENO, &readfds) .

好的,最后一步:函数调用。应该是select(1, &readfds, NULL, NULL, &timeout) .

这将返回 0如果输入缓冲区为空且 1如果不是。

UPD2:看起来它不是 C++ 流,发生了一些奇怪的事情,并且在第一次调用时缓冲区为空时中断。我会尽力解决问题。

UPD3:好的,现在我明白了。看起来你可以使用 select与 C++ 流。

Select具有非常奇怪的(恕我直言)功能:它会重置 readfds .我不确定如何防止它这样做,所以我又使用了一个 fd_set变量来保存它,所以你需要添加 fd_set savefds = readfdsreadfds 之后初始化,和 readfds = savefds每次通话后。这是糟糕的解决方案,但我不知道如何改进它。

所以代码是:

初始化:

fd_set readfds;
FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds);
fd_set savefds = readfds;

超时初始化:

struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;

和用法:

if (select(1, &readfds, NULL, NULL, &timeout)) {
cin >> input;
send(input);
}
readfds = savefds;

UPD4:不要忘记包含 unistd.hcstdlib

关于c++ - 使c++不等待用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34479795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com