当前位置: 技术问答>linux和unix
有关定时器使用的一个问题,谢谢!
来源: 互联网 发布时间:2015-09-15
本文导语: 我从网上下了一段定时器的代码,想用在自己的程序里。 #include #include #include #include #include #define PROMPT "时间已经过去了两秒钟na" char *prompt=PROMPT; unsigned int len; void prompt_info(int signo) { write(STDERR_FILEN...
我从网上下了一段定时器的代码,想用在自己的程序里。
#include
#include
#include
#include
#include
#define PROMPT "时间已经过去了两秒钟na"
char *prompt=PROMPT;
unsigned int len;
void prompt_info(int signo)
{
write(STDERR_FILENO,prompt,len);
}
void init_sigaction(void)
{
struct sigaction act;
act.sa_handler=prompt_info;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGPROF,&act,NULL);
}
void init_time()
{
struct itimerval value;
value.it_value.tv_sec=2;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_PROF,&value,NULL);
}
int main()
{
int i;
len=strlen(prompt);
init_sigaction();
init_time();
while(1)
{
i++;
}
exit(0);
}
程序运行时,每隔两秒终端上就会显示:
"时间已经过去了两秒钟"
代码稍做了修改加到我的程序里。我想某个事件发生后,每隔6秒就启动一次某个函数。
case 1:
init_sigaction();
init_time();
break;
加到一个线程函数里,我启动线程后,执行了init_sigaction()和init_time()后,并没有每隔6秒就启动一次某个函数,奇怪的是,我把上边的代码改成
case 1:
init_sigaction();
init_time();
while(1)
{
;
}
break;
就可以了,我晕,为什么要加个循环后边,我这个线程是不会轻易退出的,而且这段代码本来就加在一个大循环中,那位能告诉我定时器怎么用啊,谢谢!!
#include
#include
#include
#include
#include
#define PROMPT "时间已经过去了两秒钟na"
char *prompt=PROMPT;
unsigned int len;
void prompt_info(int signo)
{
write(STDERR_FILENO,prompt,len);
}
void init_sigaction(void)
{
struct sigaction act;
act.sa_handler=prompt_info;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGPROF,&act,NULL);
}
void init_time()
{
struct itimerval value;
value.it_value.tv_sec=2;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_PROF,&value,NULL);
}
int main()
{
int i;
len=strlen(prompt);
init_sigaction();
init_time();
while(1)
{
i++;
}
exit(0);
}
程序运行时,每隔两秒终端上就会显示:
"时间已经过去了两秒钟"
代码稍做了修改加到我的程序里。我想某个事件发生后,每隔6秒就启动一次某个函数。
case 1:
init_sigaction();
init_time();
break;
加到一个线程函数里,我启动线程后,执行了init_sigaction()和init_time()后,并没有每隔6秒就启动一次某个函数,奇怪的是,我把上边的代码改成
case 1:
init_sigaction();
init_time();
while(1)
{
;
}
break;
就可以了,我晕,为什么要加个循环后边,我这个线程是不会轻易退出的,而且这段代码本来就加在一个大循环中,那位能告诉我定时器怎么用啊,谢谢!!
|
加循环是是阻塞进程直到收到定时器的信号
|
GTK下面有定时器 ,查查gtk_timeout_add 这个函数吧。
|
xuexi...
|
walterzh(walter)说的对
加循环是是阻塞进程直到收到定时器的信号
不然在收到定时器信号之前
main函数已经退出了
加循环是是阻塞进程直到收到定时器的信号
不然在收到定时器信号之前
main函数已经退出了
|
setitimer是线程不安全的,下面的这种写法主要是想阻塞在改线程中。