【发布时间】:2014-09-27 17:03:28
【问题描述】:
假设我的程序中有一些函数 func(),我需要在特定延迟后调用它。到目前为止,我已经用谷歌搜索它并最终得到以下代码:
#include <stdio.h>
#include <sys/time.h> /* for setitimer */
#include <unistd.h> /* for pause */
#include <signal.h> /* for signal */
void func()
{
printf("func() called\n");
}
bool startTimer(double seconds)
{
itimerval it_val;
double integer, fractional;
integer = (int)seconds;
fractional = seconds - integer;
it_val.it_value.tv_sec = integer;
it_val.it_value.tv_usec = fractional * 1000000;
it_val.it_interval = it_val.it_value;
if (setitimer(ITIMER_REAL, &it_val, NULL) == -1)
return false;
return true;
}
int main()
{
if (signal(SIGALRM, (void(*)(int))func) == SIG_ERR)
{
perror("Unable to catch SIGALRM");
exit(1);
}
startTimer(1.5);
while(1)
pause();
return 0;
}
它可以工作,但问题是 settimer() 会导致 func() 以 1.5 秒的间隔重复调用。我需要的是只调用一次 func() 。 有人可以告诉我该怎么做吗?也许,我需要一些额外的参数来 settimer() ?
注意:时间间隔要精确,因为这个程序稍后会播放midi音乐。
【问题讨论】:
-
硬延迟有什么问题?
-
@IgnacioVazquez-Abrams ,如果你的意思是使用 sleep() 函数,问题是它不提供精确的时间间隔,这对于播放音乐是不可接受的
-
在
func()中停止计时器怎么样? -
我强烈建议您考虑以下替代方案:sigaction(而不是“signal()”)和timer_create。查看 timer_create 链接中的示例代码。
-
从信号处理程序内部调用函数不是一个好主意,这就是你最终会在上面做的事情。 timer_create 系列让您可以选择从单独的线程调用您的函数。