我有这个简单的倒数计时器:
#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 ......)时,可以制作正在运行的计时器吗?
答案 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的答案。