C++ 倒计时线程

C++ 倒计时线程,c++,multithreading,macos,timer,countdown,C++,Multithreading,Macos,Timer,Countdown,我有个问题。我想创建一个程序,在计时器运行时等待输入。我发现使用睡眠是行不通的,因为它会将程序冻结一段固定的时间。我不太理解时间引用和线程引用。我在mac机器上用Netbeans做这个 我怎样才能做到这一点呢?既然你在Mac上,你(很可能)正在使用OSX,它与POSIX兼容 然后,您可以使用例如轮询标准输入是否有输入。select功能还具有超时功能 可以用类似于 fd_set input_set; timeval timeout; FD_ZERO(&input_set); FD_SET

我有个问题。我想创建一个程序,在计时器运行时等待输入。我发现使用睡眠是行不通的,因为它会将程序冻结一段固定的时间。我不太理解时间引用和线程引用。我在mac机器上用Netbeans做这个


我怎样才能做到这一点呢?

既然你在Mac上,你(很可能)正在使用OSX,它与POSIX兼容

然后,您可以使用例如轮询标准输入是否有输入。
select
功能还具有超时功能

可以用类似于

fd_set input_set;
timeval timeout;

FD_ZERO(&input_set);
FD_SET(STDIN_FILENO, &input_set);

// Set timeout to one minute
timeout.tv_sec  = 60;
timeout.tv_usec = 0;

int result = select(STDIN_FILENO + 1, &input_set, nullptr, nullptr, &timeout);

if (result == -1)
    std::cout << "Error in select call: " << strerror(errno) << '\n';
else if (result == 0)
{
    // Timeout, do something here
}
else if (FD_ISSET(STDIN_FILENO, &input_set))
{
    std::string input;
    std::getline(std::cin, input);

    // Have input, do something with it
}
fd_集输入_集;
timeval超时;
FD_零位(输入_集和输入_集);
FD_集(标准文件号和输入_集);
//将超时设置为一分钟
timeout.tv_sec=60;
timeout.tv_usec=0;
int result=select(标准输入文件号+1,&input\u集,空ptr,空ptr,&timeout);
如果(结果==-1)

std::cout这是一个“控制台”还是“GUI”应用程序?@matstpeterson是的,这是一个控制台应用程序,然后您将很难使用“标准”功能来实现这一点,因为使用例如
cin
getline
等的输入,无法停止-除非您要退出整个程序。@MatsPeterson如果在计时器倒计时时我没有输入,则执行此程序没有意义。HaizI并不真正理解这部分
否则如果(FD_ISSET(STDIN_FILENO,&input_set)){std::string input;std::getline(std::cin,input);//拥有input,用它做点什么}
这是什么意思?@JoelSeah
选择
调用修改描述符集,您可以使用
FD_ISSET
宏/函数检查集合中是否设置了描述符。身体部位从标准输入流.hmmm读取一行输入。那么,每当用户输入输入时,我在哪里可以进行倒计时的显示部分呢?@JoelSeah我在回答中显示的代码只是一个示例。它的变体可以在循环中以较小的超时执行,例如倒计时。什么是fd_集、fd_零、fd_集?这个符号是什么意思?抱歉问了这么多问题。我是新来的。