C++ 如何使计时器每秒从30倒数1?

C++ 如何使计时器每秒从30倒数1?,c++,windows,chrono,C++,Windows,Chrono,我想做一个计时器,显示30,29等每秒钟下降,然后当有一个输入它停止。我知道你可以做到: for (int i = 60; i > 0; i--) { cout << i << endl; Sleep(1000); } for(int i=60;i>0;i--) { cout如果你在Linux上运行这个,你可以使用经典的select()调用。当在while循环中使用时,你可以等待一个或多个文件描述符的输入,同

我想做一个计时器,显示30,29等每秒钟下降,然后当有一个输入它停止。我知道你可以做到:

    for (int i = 60; i > 0; i--)
    {
        cout << i << endl;
        Sleep(1000);
    }
for(int i=60;i>0;i--)
{

cout如果你在Linux上运行这个,你可以使用经典的select()调用。当在while循环中使用时,你可以等待一个或多个文件描述符的输入,同时还提供一个超时,在此超时之后select()调用必须返回。将它全部包装在一个循环中,你将拥有倒计时和标准输入的处理


您的游戏大约每秒1帧,因此用户输入是一个问题。通常游戏的帧速率较高,如下所示:

#包括
#包括
int main(){
//初始化
ULARGE_整数初始时间;
ULARGE_整数当前时间;
文件时间ft;
GetSystemTimeAsFileTime(&ft);
initialTime.LowPart=ft.dwLowDateTime;
initialTime.HighPart=ft.dwHighDateTime;
LONGLONG countdownStartTime=300000000;//100纳秒
LONGLONG displayedNumber=31;//防止显示31
//游戏循环
while(true){
GetSystemTimeAsFileTime(&ft);//100纳秒
currentTime.LowPart=ft.dwLowDateTime;
currentTime.HighPart=ft.dwHighDateTime;
////读取输入////
bool-stop=false;
短键=GetKeyState('S');
如果(键&0x8000)
停止=真;
////博弈逻辑////
LONGLONG elapsedTime=currentTime.QuadPart-initialTime.QuadPart;
LONGLONG currentNumber_100ns=countdownStartTime-elapsedTime;

如果(currentNumber_100ns我认为这不是最好的解决方案,但我希望这对您有所帮助:)

#包括
#包括
#包括
使用名称空间std;
int main()
{
omp_设置_数量_线程(2);
volatile bool flag=true;
#pragma-omp并行
{
对于(int i=0;i<60;i++)
{
如果(!flag)中断;
if(omp\u get\u thread\u num()=0)
{


这听起来像是一个很好的家庭作业。你尝试了什么?遇到了什么问题?你对你的实施有什么问题?我们如何帮助你完成你的家庭作业?这不是家庭作业,对不起,这个问题不好,我澄清了。告诉我你是否需要更多信息。Fwiw,没有wa,我不会投反对票rning。这些下行投票不是我的。我推荐一个线程来进行倒计时和显示,该线程还应该检查“输入”的标志。我还建议使用
std::this_thread::sleep_until
,而不是
sleep
,以保持倒计时的准确性,并简化逻辑。不幸的是,如果不进行一些异步/多线程编程,就无法解决此问题,因为
sleep
cin
都会使程序暂停。请看一下答案是使用
std::future
超时读取用户输入:我不完全理解,我把它放入了我的代码中,但它不只是做了与
string input getline(cin,input)相同的事情吗难道不幸的是,我正在使用Windows Winsock2已经选择了什么是winstock2?最初由小号公司推出,它为Windows 3.0提供了一个TCP堆栈,这样你就可以连接到拨号服务提供商……我不太明白你在这里说的话。简单一点:Include
conio.h
。Insert
if(_getch()='s'))在
睡眠(1000)
之前中断;
,这样当你按s键时循环可以提前停止。现在它只在我键入a时运行character@evilhoomans42:答案建议使用,因此您可以避免使用该解决方案的线程。@evilhoomans42抱歉,这是个坏主意。我将重写我的答案。现在它显示所有std元素(cin、cout等)你的编译器是什么?如果你使用devc++你必须这样做:打开devc++,工具->编译器选项->常规选项卡->在调用编译器时添加以下命令->写入-fopenmpI使用visual studio 2019我希望这个链接对你有所帮助。我想你在使用visual studio时不需要这个。
#include <iostream>
#include <Windows.h>
#include <omp.h>
using namespace std;

int main()
{
    omp_set_num_threads(2);
    volatile bool flag = true;
#pragma omp parallel
    {
        for (int i = 0; i < 60; i++)
        {
            if(!flag) break;
            if (omp_get_thread_num() == 0)
            {
                cout << i << endl;
                Sleep(1000);
            }
            if(omp_get_thread_num() == 1)
            {
                cout<<"asd";
                int x;
                cin>>x;
                flag = false;
            }
        }
    }
    return 0;
}