在线程中起定时器问题

时间:2021-07-09 02:41:45
我在进入一个ui界面后,创建一个线程,并在里建立一个定时器,超时后关闭当前的ui界面,但在此时再进入此ui界面时定时器就无法起了,
如果在进程里创建定时器,则无法关闭父进程中的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); 

#5


这里不适合使用信号来处理。
我觉得可以使用一个专门处理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); 

#5


这里不适合使用信号来处理。
我觉得可以使用一个专门处理timer的线程来做。
这个线程维护一个队列。里面有多个timer。
任何一个需要时间超时的线程,吧自己所需要的timer信息发送给这个线程队列,
这个timer到时间后发送回来一个触发消息。
这个线程的主要工作就是周期性的检查有没有timer创建请求,timer应不应该触发。

#6


多谢楼上的解答,但还有一个问题,为什么调用第一次的时候定时器可以正常处理,但第二次显示该ui时,定时就不运行了,还请高手解答一下吧,我想知道原因,是哪里出的问题?

#7


什么ui?做 QT吗?用QTimer啊。