C++ 每隔一段时间进行一次操作

C++ 每隔一段时间进行一次操作,c++,c,unix,C++,C,Unix,我想在某个特定的超时时间执行该操作,比如点火 事件我知道如何每n秒做一次,但不是1.5秒 秒。这是我的。请建议如何处理我的案件: void Publish() { static int local_time=time(NULL); int current_time = time (NULL); if((current_time+PUBLISH_TIMEOUT)>local_time) { fireEvent();

我想在某个特定的超时时间执行该操作,比如点火 事件我知道如何每n秒做一次,但不是1.5秒 秒。这是我的。请建议如何处理我的案件:

void Publish()
{
    static  int local_time=time(NULL);

     int current_time = time (NULL);
     if((current_time+PUBLISH_TIMEOUT)>local_time)
      {
           fireEvent();
            local_time=current_time;
      } 
}
gettimeofday()
返回微秒,因此您可以使用它来代替
time()
-请参阅此函数填充的
struct timeval的定义

有关详细信息,请查看
man gettimeofday

gettimeofday()
返回微秒,因此可以使用它来代替
time()
-请参阅
struct timeval
此函数的定义


有关详细信息,请查看
man gettimeofday

这将以毫秒为单位返回自应用程序启动以来的墙时间。它使用机器时钟,因此很可能在应用程序运行时更改时钟的时间会使其混淆。在您的例子中,我将向我的事件对象添加一个调度时间,并在调度时间时触发,这将返回应用程序启动以来的墙时间(毫秒)。它使用机器时钟,因此很可能在应用程序运行时更改时钟的时间会使其混淆。在您的情况下,我会在我的事件对象中添加一个schedule time,并在schedule time时根据Nick的回答启动一个完整的解决方案:

#include <sys/time.h>
#include <iostream>
#include <cstdlib>

using namespace std;

int TOTAL_PROCESSES;
double TIMEOUT;
int process()
{

    static struct timeval msec_base;
    struct timeval now;

    long seconds, useconds; 
    if (!msec_base.tv_usec)
        gettimeofday(&msec_base, NULL);

    gettimeofday(&now, NULL);

    seconds  = now.tv_sec  - msec_base.tv_sec;
    useconds = now.tv_usec - msec_base.tv_usec;

    double time_diff=seconds+ useconds/100000.0;

    if(TIMEOUT < time_diff)
    {
        cout<<TIMEOUT <<" seconds...\n";
        msec_base=now;

        return 1;
    }
     return 0;

}

int main(int argc, char** argv)
{
    if(argc < 3)
    {
        cout<<"Error: missing TIMOUT and total time to fire\n";
        return -1;

    }

    TIMEOUT       = atof(argv[1]);
    TIMES_TO_FIRE = atoi(argv[2]);

    cout << "INFO: TIMEOUT="<<TIMEOUT<<", TIMES_TO_FIRE ="<< TIMES_TO_FIRE <<endl; 


    int i=0;
    while (i< TIMES_TO_FIRE)
      i+=process();

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int-TOTAL_过程;
双超时;
int进程()
{
静态结构timeval msec_基;
现在构造timeval;
长秒,用秒;
如果(!msec_base.tv_usec)
gettimeofday(&msec_base,NULL);
gettimeofday(&now,NULL);
秒=now.tv_sec-msec_base.tv_sec;
useconds=now.tv_usec-msec_base.tv_usec;
双时差=秒+秒/100000.0;
如果(超时<时间差)
{

能否根据Nick的答案找到一个完整的解决方案:

#include <sys/time.h>
#include <iostream>
#include <cstdlib>

using namespace std;

int TOTAL_PROCESSES;
double TIMEOUT;
int process()
{

    static struct timeval msec_base;
    struct timeval now;

    long seconds, useconds; 
    if (!msec_base.tv_usec)
        gettimeofday(&msec_base, NULL);

    gettimeofday(&now, NULL);

    seconds  = now.tv_sec  - msec_base.tv_sec;
    useconds = now.tv_usec - msec_base.tv_usec;

    double time_diff=seconds+ useconds/100000.0;

    if(TIMEOUT < time_diff)
    {
        cout<<TIMEOUT <<" seconds...\n";
        msec_base=now;

        return 1;
    }
     return 0;

}

int main(int argc, char** argv)
{
    if(argc < 3)
    {
        cout<<"Error: missing TIMOUT and total time to fire\n";
        return -1;

    }

    TIMEOUT       = atof(argv[1]);
    TIMES_TO_FIRE = atoi(argv[2]);

    cout << "INFO: TIMEOUT="<<TIMEOUT<<", TIMES_TO_FIRE ="<< TIMES_TO_FIRE <<endl; 


    int i=0;
    while (i< TIMES_TO_FIRE)
      i+=process();

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int-TOTAL_过程;
双超时;
int进程()
{
静态结构timeval msec_基;
现在构造timeval;
长秒,用秒;
如果(!msec_base.tv_usec)
gettimeofday(&msec_base,NULL);
gettimeofday(&now,NULL);
秒=now.tv_sec-msec_base.tv_sec;
useconds=now.tv_usec-msec_base.tv_usec;
双时差=秒+秒/100000.0;
如果(超时<时间差)
{

cout您可以使用boost::asio实现这一点,请参阅此处的文档:


您可以使用boost::asio,请参阅此处的文档:

如果这是C,为什么不使用and

setitimer()的作用是,在特定的时间间隔(您可以指定高达毫秒)触发SIGALRM信号。然后,您可以设置程序,使其具有响应该信号的函数

alarm()函数的作用与setitimer()相同,但alarm()只在1秒的时间间隔(不是1.5秒等)内工作。也就是说,它提供了如何处理中断的教程。使用此方法计算代码可以节省大量时间。

如果是C,为什么不使用and

setitimer()的作用是,在特定的时间间隔(您可以指定高达毫秒)触发SIGALRM信号。然后,您可以设置程序,使其具有响应该信号的函数


alarm()函数的作用与setitimer()相同,但alarm()只在1秒的时间间隔内工作(而不是1.5秒等)也就是说,提供了一个如何处理中断的教程。使用此方法可以节省大量计算代码的时间。

我知道这不是基于秒的,但您可以根据处理器使用rdtsc寄存器…更多详细信息(用于在linux中测量时间间隔)

我知道这不是基于秒的,但您可以根据处理器使用rdtsc寄存器…更多详细信息(用于在linux中测量时间间隔)

@puzzlecracker

CPU负载不是一个问题吗?您的例程会不必要地多次检查某个条件。当它未命中时,我会使用usleep()

...

 if(TIMEOUT < time_diff)
{
    cout<<TIMEOUT <<" seconds...\n";
    msec_base=now;

    return 1;
} else usleep(10);

...
。。。
如果(超时<时间差)
{
拼图饼干

CPU负载不是一个问题吗?您的例程会不必要地多次检查某个条件。当它未命中时,我会使用usleep()

...

 if(TIMEOUT < time_diff)
{
    cout<<TIMEOUT <<" seconds...\n";
    msec_base=now;

    return 1;
} else usleep(10);

...
。。。
如果(超时<时间差)
{

coutI从“static int local_time”中删除了static,因为它没有太多的逻辑为什么不?我只想初始化一次local_time,然后继续更新它。请注意,publish一直被调用我从“static int local_time”中删除了static因为它没有太多的逻辑为什么不呢?我只想初始化本地时间一次,然后继续更新它。请注意,在经过几次修改后,一直调用publish,我使它正常工作,特别是您不需要将秒数乘以1000,并且您必须将useconds删除10000.0。谢谢。您可能需要查看每个时钟_秒解决这些问题。经过几次修改后,我使其生效,特别是您不需要将秒数乘以1000,并且您必须将useconds删除10000.0,谢谢。您可能需要查看每秒时钟以解决这些问题。我认为您不能,因为我需要非阻塞来从不阻塞,但跳过e执行直到超过超时。我不认为您可以,因为我需要一个非阻塞来从不阻塞,但在超过超时之前跳过执行。这不起作用,因为我只想在信息可用且超时已过期时调用。好的,实现这一点的方法可能是:您的计时器代码需要检查信息是否可用在设置SIGALRM时可用。或者结合报警取消来执行此操作。如果需要几秒钟的时间,可以使用nanosleep()这不起作用,因为我只想在信息可用且超时已过期时打电话。好的,实现这一点的方法可能是:您的计时器代码需要检查SIGALRM启动时信息是否可用