如何等待时间到期

时间:2013-10-21 16:59:59

标签: c timer virtual

我希望定时运行一个函数,给出一个时间步。最有效的方法是什么?

我知道我可以暂时使用,只是继续检查直到dt时间段过去。但我想知道是否有更好,更有效/更优雅的功能可供使用。

我正在研究虚拟计时器和sigaction。使用这个方法,我会让sigaction处理程序在时间结束时设置一个标志,但我仍然需要坐在while循环中检查是否在我的main函数中设置了该标志。或者我想知道我是否真的可以让处理程序运行该函数,但是我必须传递很多参数,据我所知,处理程序不接受参数,所以我将不得不使用大量的全局变量

解决这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

最简单的方法是使用sleep中定义的usleepunistd.h

如果这些都不可用,那么常见的解决方法是在没有文件描述符的情况下使用select超时。

答案 1 :(得分:0)

在* IX'系统上你可以

  • 安装SIGALRM的处理程序,它什么都不做
  • 使用alarm()
  • 设置闹钟
  • 呼叫阻止pause()

如果发出警报信号,pause()将返回

  • 你可以运行有问题的功能,
  • 再次设置闹钟
  • 重新调用pause()

#define _POSIX_SOURCE 1

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>

void handler_SIGALRM(int signo)
{
  signo = 0; /* Get rid of warning "unused parameter ‘signo’" (in a portable way). */

  /* Do nothing. */
}

int main()
{
  /* Override SIGALRM's default handler, as the default handler might end the program. */
  {
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));

    sa.sa_handler = handler_SIGALRM;

    if (-1 == sigaction(SIGALRM, &sa, NULL ))
    {
      perror("sigaction() failed");
      exit(EXIT_FAILURE);
    }
  }

  while (1)
  {
     alarm(2); /* Set alarm to occur in two seconds. */

     pause(); /* The call blocks until a signal is received; in theis case typically SIGARLM. */

     /* Do what is to be done every 2 seconds. */
  }

  return EXIT_SUCCESS;
}

答案 2 :(得分:0)

包含time.h并使用像

这样的睡眠功能
#include <time.h>
#include <stdio.h>
#include<windows.h> 
#include <conio.h>

int main() {
    printf("I am going to wait for 4 sec");
    Sleep(4000); //sleep for 4000 microsecond= 4 second
    printf("Finaaly the wait is over");
    getch();
    return 0;
}

它将为您提供微秒级别的精确延迟。 希望它有所帮助。