0

在给定时间步长的情况下,我希望定期运行一个函数。最有效的方法是什么?

我知道我可以用一段时间看一下,然后继续检查直到 dt 期过去。但我想知道是否有更好、更高效/优雅的功能可供使用。

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

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

4

3 回答 3

0

最简单的方法是使用sleepusleep定义在unistd.h.

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

于 2013-10-21T17:01:49.517 回答
0

在 *IX'ish 系统上,您可以

  • 为 安装一个处理程序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;
}
于 2013-10-21T17:05:05.330 回答
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;
}

它会给你一个微秒级的精确延迟。希望它有所帮助。

于 2013-10-21T17:10:22.300 回答