可以从用户检索输入并运行另一个进程
Possible to retrieve input from user and running another process?
是否可以在我的程序顶部使用getline(cin,buffer);
,然后在它下面仍然运行一个"动画菜单"?例如(非常基本):
#include <iostream>
#include <string>
using namespace std;
int stringLen=0;
string buffer;
getline(cin, buffer);
for (int i = 0; i < kMaxWait;i++)
{
printf("counter waiting for user input %d",i);
if (1 >= buffer.length())
break;
}
我是否必须以某种方式分叉该循环,以便它继续计数并显示计数器,直到用户输入某些内容?
注释中给出的一个可能的答案是使用线程。但这不是必需的,有一种方法可以在没有线程的情况下做到这一点。
-
使 stdin 成为非阻塞文件描述符。
-
等待 stdin 变得可读,通过 poll()/select(),同时做你的动画,等等......
-
再次使 stdin 成为阻塞文件描述符。
-
使用 std::getline()。
还有一些辅助问题需要考虑,例如来自std::streambuf
的缓冲,所以在执行所有这些操作之前,请先检查是否已经有内容要从std::cin
读取。
这是我
前段时间用过的东西。这很简陋,但您可以了解该过程的要点 - 使用 poll
.如果有输入,则返回 true,并将其放入 str
中,否则为 false。因此,您可以将其放在循环中的某个地方,并在有输入时采取行动。
bool polled_input(std::string& str)
{
struct pollfd fd_user_in;
fd_user_in.fd = STDIN_FILENO;
fd_user_in.events = POLLIN;
fd_user_in.revents = 0;
int rv = poll(&fd_user_in, 1, 0);
if (rv == -1) {/* error */}
else if (rv == 0) return false;
else if (fd_user_in.revents & POLLIN)
{
char buffer[MAX_BUFF_SIZE];
int rc = read(STDIN_FILENO, buffer, MAX_BUFF_SIZE-1);
if (rc >= 0)
{
buffer[rc]=' ';
str = std::string(buffer);
return true;
}
else {/* error */}
}
else {/* error */}
}
select
就是为此而设计的,多路复用,阻塞I/O。我认为可以在没有poll
的情况下完成:
#include <iostream>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char **arg)
{
const int time_in_secs = 10;
const int buffer_size = 1024;
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds);
struct timeval tv;
tv.tv_sec = time_in_secs;
tv.tv_usec = 0;
int ret = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv);
if (!ret)
{
std::cout << "Timeoutn";
exit(1);
}
char buf[buffer_size];
if (FD_ISSET(STDIN_FILENO, &readfds))
{
int len = read(STDIN_FILENO, buf, buffer_size);
buf[len] = ' ';
}
std::cout << "You typed: " << buf << "n";
return 0;
}
相关文章:
- 运行同一解决方案的另一个项目的项目
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 使用另一个程序调用正在运行的 C++ 程序中的函数
- System Verilog DPI - 在 cpp 中运行并行线程,在 SV 中运行另一个并行线程
- 使用 (cin) 用户输入将其粘贴到 std::system 中,并在另一个终端中运行带有输入的命令
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- 助推.如何在另一个测试单元中运行一个测试组件
- 给定的两个代码有什么区别.一个在 ideone 上运行时超出时间限制,另一个工作正常
- C++ 减慢另一个正在运行的进程
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 字符* 复制到另一个字符* 运行时错误
- C++ 菜单代码 - 运行另一个类
- 我无法使用 c++(代码块)中的 fstream 将文件内容复制到另一个。如何运行该文件?
- 一个应用程序可以运行另一个应用软件的代码吗
- 可以从用户检索输入并运行另一个进程
- 从C++程序在Linux中运行另一个程序
- 我如何打开/等待一个程序在c++中完成,然后运行另一个
- 编写一个程序来运行另一个已编写的程序
- 如何从c++程序中运行另一个程序
- 在我的Qt应用中运行另一个可执行文件