C ++如何停止倒数计时器?

时间:2014-08-26 19:30:16

标签: c++

我有这个简单的倒数计时器:

#include <iostream>     
#include <windows.h>
using namespace std;

int main ()
{
    for(int i=9; i>=0; i--)
    {
        cout << i;
        cout << string(1,'\b');
        Sleep(1000);
    }
    system("pause > nul");
    return 0;
}

每当我按下P&#39; P&#39;我想暂停它。然后用&#39; R&#39;恢复它。

我该如何修改它?通常情况下,当我继续进行其他操作(如cin,cout ......)时,可以制作正在运行的计时器吗?

3 个答案:

答案 0 :(得分:1)

这有两种方法。您可以使用现有的库,例如 ncurses

#include <curses.h>

int main(void) {
  initscr();
  timeout(-1);
  int c = getch();
  endwin();
  printf ("%d %c\n", c, c);
  return 0;
}

如果您不想使用外部库,则可以编写多线程应用程序。在一个线程中,您可以运行倒计时功能,并进行额外检查,例如:

for(int i=9; i>=0; )
{
    pthread_mutex_lock(&someMutex);
    if (someBool == true) {
      // do someting else
    } else {
      cout << i;
      cout << string(1,'\b');
      Sleep(1000);
      i--;
    }
    pthread_mutex_unlock(&someMutex);
}

然后,在另一个线程中,您使用getchar或其他一些机制等待用户输入。

答案 1 :(得分:0)

您需要线程来执行此操作,或者使用隐式与回调结合使用它们的计时器。

答案 2 :(得分:0)

暂停计时器

如果您对可移植性不感兴趣,可以#include<conio.h>(在Windows上可用)并使用kbhit()检查键盘缓冲区中是否有要读取的内容,并使用{{1检查按下了哪个键,示例实现:

getch()

在计时器运行时使用#include<iostream> #include<conio.h> #include<windows.h> using std::cout; int main (){ for(int i=9; i>=0; i--){ if(kbhit()){ auto got=getch(); if(got=='p'||got=='P'){ cout<<"PAUSED, R to resume.\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"; do auto got=getch(); while(got!='r'&&got!='R'); } } cout << i << '\b'; Sleep(1000); } do; while(getch()!='\n'); /*don't use system("anything") when unnecessary, *it calls external program to do work for your. */ }

std::cin锁定线程执行。如果您想在计时器运行时使用它,我会将您重定向到@ Dogbert的答案。