如果在进程里创建定时器,则无法关闭父进程中的ui界面,请帮忙 谢谢 我是新手
创建的线程 pthread_create(&s_hthread, NULL, (void*)time_test, NULL);
static void time_test()
{
test();
EndDialog(temp, 0);//关闭当前ui
exit(0);
}
int test()
{
signal(SIGALRM, sigalrm_handler);
//init_sigaction();
set_timer();
while (count < 2)
{}
signal(SIGALRM,SIG_IGN);
//signal(SIGCHLD,SIG_IGN);
return;
}
分不多给20分吧
7 个解决方案
#1
最好不要用信号。
#2
那用什么 linux我不熟 有什么更好的方法吗?
#3
超时后,你有没有重新设置 定时器?
你的代码 怎么让人看的迷糊
你的代码 怎么让人看的迷糊
#4
之前的代码没贴全 修改一下 目前的处理是这样的
void set_timer() //在另一个文件中定义
{
itv.it_interval.tv_sec = 1;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = 1;
itv.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itv, &oldtv);
}
void sigalrm_handler(int sig) //在另一个文件中定义
{
count++;
printf("timer signal.. %d\n", count);
}
int test() //在另一个文件中定义
{
signal(SIGALRM, sigalrm_handler);
set_timer();
while (count < 2)
{}
signal(SIGALRM,SIG_IGN);
return;
}
static void * time_test()
{
test();
EndDialog(temp, 0);//关闭当前ui
pthread_exit((void *)1);
}
pthread_create(&s_hthread, NULL, time_test, NULL);
void set_timer() //在另一个文件中定义
{
itv.it_interval.tv_sec = 1;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = 1;
itv.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itv, &oldtv);
}
void sigalrm_handler(int sig) //在另一个文件中定义
{
count++;
printf("timer signal.. %d\n", count);
}
int test() //在另一个文件中定义
{
signal(SIGALRM, sigalrm_handler);
set_timer();
while (count < 2)
{}
signal(SIGALRM,SIG_IGN);
return;
}
static void * time_test()
{
test();
EndDialog(temp, 0);//关闭当前ui
pthread_exit((void *)1);
}
pthread_create(&s_hthread, NULL, time_test, NULL);
#5
这里不适合使用信号来处理。
我觉得可以使用一个专门处理timer的线程来做。
这个线程维护一个队列。里面有多个timer。
任何一个需要时间超时的线程,吧自己所需要的timer信息发送给这个线程队列,
这个timer到时间后发送回来一个触发消息。
这个线程的主要工作就是周期性的检查有没有timer创建请求,timer应不应该触发。
我觉得可以使用一个专门处理timer的线程来做。
这个线程维护一个队列。里面有多个timer。
任何一个需要时间超时的线程,吧自己所需要的timer信息发送给这个线程队列,
这个timer到时间后发送回来一个触发消息。
这个线程的主要工作就是周期性的检查有没有timer创建请求,timer应不应该触发。
#6
多谢楼上的解答,但还有一个问题,为什么调用第一次的时候定时器可以正常处理,但第二次显示该ui时,定时就不运行了,还请高手解答一下吧,我想知道原因,是哪里出的问题?
#7
什么ui?做 QT吗?用QTimer啊。
#1
最好不要用信号。
#2
那用什么 linux我不熟 有什么更好的方法吗?
#3
超时后,你有没有重新设置 定时器?
你的代码 怎么让人看的迷糊
你的代码 怎么让人看的迷糊
#4
之前的代码没贴全 修改一下 目前的处理是这样的
void set_timer() //在另一个文件中定义
{
itv.it_interval.tv_sec = 1;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = 1;
itv.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itv, &oldtv);
}
void sigalrm_handler(int sig) //在另一个文件中定义
{
count++;
printf("timer signal.. %d\n", count);
}
int test() //在另一个文件中定义
{
signal(SIGALRM, sigalrm_handler);
set_timer();
while (count < 2)
{}
signal(SIGALRM,SIG_IGN);
return;
}
static void * time_test()
{
test();
EndDialog(temp, 0);//关闭当前ui
pthread_exit((void *)1);
}
pthread_create(&s_hthread, NULL, time_test, NULL);
void set_timer() //在另一个文件中定义
{
itv.it_interval.tv_sec = 1;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = 1;
itv.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itv, &oldtv);
}
void sigalrm_handler(int sig) //在另一个文件中定义
{
count++;
printf("timer signal.. %d\n", count);
}
int test() //在另一个文件中定义
{
signal(SIGALRM, sigalrm_handler);
set_timer();
while (count < 2)
{}
signal(SIGALRM,SIG_IGN);
return;
}
static void * time_test()
{
test();
EndDialog(temp, 0);//关闭当前ui
pthread_exit((void *)1);
}
pthread_create(&s_hthread, NULL, time_test, NULL);
#5
这里不适合使用信号来处理。
我觉得可以使用一个专门处理timer的线程来做。
这个线程维护一个队列。里面有多个timer。
任何一个需要时间超时的线程,吧自己所需要的timer信息发送给这个线程队列,
这个timer到时间后发送回来一个触发消息。
这个线程的主要工作就是周期性的检查有没有timer创建请求,timer应不应该触发。
我觉得可以使用一个专门处理timer的线程来做。
这个线程维护一个队列。里面有多个timer。
任何一个需要时间超时的线程,吧自己所需要的timer信息发送给这个线程队列,
这个timer到时间后发送回来一个触发消息。
这个线程的主要工作就是周期性的检查有没有timer创建请求,timer应不应该触发。
#6
多谢楼上的解答,但还有一个问题,为什么调用第一次的时候定时器可以正常处理,但第二次显示该ui时,定时就不运行了,还请高手解答一下吧,我想知道原因,是哪里出的问题?
#7
什么ui?做 QT吗?用QTimer啊。