Ads 468x60px

##EasyReadMore##

12 5月, 2017

[ C] 整分計時器


整分才開始計時
不使用 sleep + while 的原因是因為 sleep 會執行完程式才會開始計數
久了會造成時間不準的問題
所以採用 singnal 來做問隔計時
sample code 如下:

#include <stdio.h>  
#include <signal.h>  
#include <time.h>  
#include <string.h>  
#include <stdlib.h>  
#include <unistd.h>  
  
#define CLOCKID CLOCK_REALTIME  

int getTime(char *p) {
 time_t lt;
 time(&lt);

 struct tm* tm_1 = localtime(&lt);
 sprintf(p, "%d-%02d-%02d %02d:%02d:%02d", tm_1->tm_year + 1900, tm_1->tm_mon + 1,
   tm_1->tm_mday, tm_1->tm_hour, tm_1->tm_min, tm_1->tm_sec);
 return 1;
}

void timer_thread(union sigval v)  
{
 char datetiem[16];

 getTime(datetiem);
    printf("timer_thread function! %s\n", datetiem);
}  
  
int main()  
{  
    // XXX int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid);  
    // clockid--值:CLOCK_REALTIME,CLOCK_MONOTONIC,CLOCK_PROCESS_CPUTIME_ID,CLOCK_THREAD_CPUTIME_ID  
    // evp--存放環境值的地址,結構成員說明了定時器到期的通知方式和處理方式等  
    // timerid--定時器標識符  
    timer_t timerid;  
    struct sigevent evp;  
    memset(&evp, 0, sizeof(struct sigevent));       //清零初始化  
  
    evp.sigev_value.sival_int = 111;            //也是標識定時器的,這和timerid有什麼區別?回調函數可以獲得  
    evp.sigev_notify = SIGEV_THREAD;            //定時器到期時將启動新的線程進行需要的處理
    evp.sigev_notify_function = timer_thread;       //線程函數地址  
  
    if (timer_create(CLOCKID, &evp, &timerid) == -1)  
    {  
        perror("fail to timer_create");  
        exit(-1);  
    }  
  
    // XXX int timer_settime(timer_t timerid, int flags, const struct itimerspec *new_value,struct itimerspec *old_value);  
    // timerid--定時器標識  
    // flags--0表示相對時間,1表示絕對時間  
    // new_value--定時器的新初始值和間隔,如下面的it  
    // old_value--取值通常為0,即第四個參數常為NULL,若不為NULL,則返回定時器的前一個值  
      
    //第一次間隔it.it_value這麼長,以後每次都是it.it_interval這麼長,就是說it.it_value變0的時候會裝載it.it_interval的值  
    struct itimerspec it;  
    it.it_interval.tv_sec = 60;  
    it.it_interval.tv_nsec = 0;  
    it.it_value.tv_sec = 1;  
    it.it_value.tv_nsec = 0;

    /*wait time to 0*/
    struct tm *stm;
    time_t tt;
    char show_time[32];
    
    getTime(show_time);
    printf("timer function start! %s\n", show_time);

    do{
     time(&tt);
     stm = localtime(&tt);
     // sprintf(show_time,"%d",stm->tm_sec);
     // puts(show_time);
     usleep(100000);
    }while((stm->tm_sec) != 59);

    /*start time thread*/
    if (timer_settime(timerid, 0, &it, NULL) == -1)  
    {  
        perror("fail to timer_settime");  
        exit(-1);  
    }  
  
    pause();  
  
    return 0;  
}  
/* 
 * int timer_gettime(timer_t timerid, struct itimerspec *curr_value); 
 * 獲取timerid指定的定時器的值,填入curr_value 
 * 
 */  

Refference:
linux下定时器的使用--timer_create等系列 - leo9150285的专栏 - 博客频道 - CSDN.NET - https://goo.gl/va6eA1
Linux timer | 菜鳥的三年成長史 - https://goo.gl/5IOQ8m

0 意見:

張貼留言

 
Blogger Templates