如何在C ++中执行60秒的while循环?

时间:2017-08-01 16:20:45

标签: c++ while-loop

有谁知道如何运行此循环60秒然后停止?这是我的代码:

#include<iostream.h>
#include<conio.h>
int main()
{
    clrscr();
    int a=1;
    int b;
    cout<<"3.";
    b=a*10%7;
    while(b!=0)
    {
        cout<<a/7;
        a=b*10;
        b=a%7;
    }
    getch();
    return 0;
}

7 个答案:

答案 0 :(得分:2)

使用<chrono>库。

#include<iostream>
#include<conio.h>
#include<chrono>

int main()
{
    clrscr();
    int a=1;
    int b;
    std::cout<<"3."; //Don't use 'using namespace std;'...
    b=a*10%7;
    std::chrono::steady_clock::timepoint start = std::chrono::steady_clock::now();
    while(b!=0)
    {
        std::cout<<a/7;
        a=b*10;
        b=a%7;
        if(std::chrono::steady_clock::now() - start > std::chrono::seconds(60)) 
            break;
    }
    getch();
    return 0;
}

答案 1 :(得分:2)

在开始循环之前获取时间。加60秒。每次循环都会获得时间并将其与目标时间进行比较。已经60秒了吗?如果是这样,请停止。

查看http://en.cppreference.com/w/cpp/header/chrono的C ++库标题。

答案 2 :(得分:1)

以下是使用chrono

的一个工作示例
#include<iostream>
#include <chrono>
using namespace std;
int main()
{
    int a=1;
    int b;
    cout<<"3.";
    b=a*10%7;

    auto start = std::chrono::system_clock::now();
    auto end = std::chrono::system_clock::now();
    while((std::chrono::duration_cast<std::chrono::seconds>(end - start).count() != 60))

    {
        end = std::chrono::system_clock::now();
        cout<<"Time is"<<std::chrono::duration_cast<std::chrono::seconds>(end - start).count()<<" second"<<endl;

        cout<<a/7<<endl;
        a=b*10;
        b=a%7;
    }
}

输出(输出的一部分)

4
Time is59 second
2
Time is60 second
8
Program ended with exit code: 0

答案 3 :(得分:0)

你可以确保循环不会在60秒后使用time.h!

执行
#include <time.h>
using namespace std;

clock_t start = clock();
while ( (clock() - start)/CLOCKS_PER_SECOND <= 60)
    //do stuff here

这实际上是抓取当前时钟的数量并将其分配给start。在此之后,循环的每次迭代,它检查当前时钟和start时钟之间的差异除以转换时的每秒时钟因子是否小于或等于您想要的60秒。

希望这有帮助!

答案 4 :(得分:0)

您只需在循环中插入时间检查即可实现。 从 C ++ 11 开始,您可以使用chrono standard library

这个想法是following code snippet中显示的那个。

我在模板中设计了这个函数,以便更通用,只显示带有计时器的条件循环。

那是:

template <std::int64_t Seconds, typename Fn, typename... Args>
void repeat_for_seconds(Fn&& fn, Args&&... args) {
  using ClockType = std::chrono::system_clock;

  // Time at the start of the function
  auto time_start = ClockType::now();

  while (std::chrono::duration_cast<std::chrono::seconds>(ClockType::now() -
                                                          time_start)
             .count() < Seconds) {
    /* execute code you want in the while loop */
  }
}

由于 ideone策略,该代码段的延迟时间为3秒,但您可以在第一个模板参数中轻松更改它。

答案 5 :(得分:0)

试试这个:

for (auto start = std::chrono::steady_clock::now(), now = start; now < start + std::chrono::seconds{60}; now = std::chrono::steady_clock::now()) 
{}  

答案 6 :(得分:0)

一种方法是将信号处理程序注册60秒。

以下是使用信号处理程序的示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

#define INTERVAL 60             // number of seconds to go off

void sigTimerStop(int signum) {
    printf("Timer ran out! Stopping timer\n");
}

void sigTimerSet(int interval) {
    printf("starting timer\n");
    struct itimerval it_val;

    it_val.it_value.tv_sec = interval;
    it_val.it_value.tv_usec = 0;
    it_val.it_interval.tv_sec = 0;
    it_val.it_interval.tv_usec = 0;

    if (signal(SIGALRM, sigTimerStop) == SIG_ERR) {
        perror("Unable to catch SIGALRM");
        exit(1);
    }
    if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) {
        perror("error calling sigsetitimer()");
        exit(1);
    }
}

int main(int argc, char *argv[]) {

    sigTimerSet(INTERVAL);

    while (1) {
        // do stuff
    }
    return 0;
}