2011-04-22 55 views

回答

1

如果你只想要第二個精度。如果包含time.h,則使用返回當前時間的time(0)

更新: 這期間20秒打印在每一秒10添加簡單的例子:

#include <time.h> 
#include <stdio.h> 

int main() 
{ 
    int a = 10; 
    int num = 20; 
    int c = time(0); 
    while(n--) 
    { 
     printf("%d\n", a); 
     while(!(time(0) - c)); 
     c = time(0); 
    } 
    return 0; 
} 
+0

不,我想在每1秒後打印一個變量。所以我們的程序如何知道1秒鐘過去了,以便它可以打印變量。 – piyush 2011-04-22 12:07:55

+0

這裏'時間(0) - c'將是0(假),而目前的秒數正在進行。 您也可以在Windows中使用'Sleep()'和unix中的'sleep()'來在指定的時間內使您的程序休眠。 – 2011-04-22 12:12:34

0

使用time(0)看到這個例子

/* timer.c */ 
#include <stdio.h> 
#include <time.h> 

void delay_sec(int seconds){ 
    clock_t endwait; 
    endwait = clock() + seconds * CLOCKS_PER_SEC; 
    while (clock() < endwait) {} 
} 

int main (void){ 
    time_t rawtime, ini_time, now; 
    struct tm *ptm; 

    time (&ini_time); 
    for(;;){ 
     time (&rawtime); 
     //ptm = gmtime (&rawtime); 
     //printf ("%2d:%02d:%02d\n", ptm_2->tm_hour, ptm_2->tm_min, ptm_2->tm_sec); 
     now = rawtime - ini_time; 
     ptm = gmtime (&now); 
     printf ("%2d:%02d:%02d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec); 
     delay_sec(1); 
    } 
    return 0; 
} 
0

我相信你知道1000 Milliseconds等於1 Second

#include <stdio.h> 
#include <time.h> 
#define mydelay 1000 

void delay(int mseconds) 
{ 
    clock_t wait = mseconds + clock(); 
    while (wait > clock()); 
} 

int main() 
{ 
    int i=100; 
    while(1) 
    { 
      printf("%d\n",i); 
      delay(mydelay); 
    }    
    return 0; 
} 
+0

實際上,在我們的程序中,我創建了100個線程,因此需要花費時間,因此我想在每秒鐘後打印變量而不應用等待我們的睡眠。 – piyush 2011-04-22 12:14:02

+0

向我們展示一些代碼。 – Sadique 2011-04-22 12:14:41

3

如果所有你有興趣做的是打印變量的值在間隔一秒,使用time(2)clock(3)在其他的答案可能就足夠了建議。一般來說,我不會推薦這些技術。


如果你的程序比較複雜,我建議你調查使用alarm(2)settimer(2)功能在一秒鐘的時間間隔異步傳遞一個信號,你的應用程序。

下面的示例使用select(2),以便最小化與忙等待技術相關聯的CPU的使用率無限期地阻塞。阻塞select()呼叫被中斷,並在信號被捕獲時返回。在SIGALRM信號的情況下,print_variable標誌被置位並且打印值爲variable

實施例1:使用alarm()

#include <signal.h> 
#include <stdio.h> 
#include <sys/select.h> 
#include <unistd.h> 

volatile unsigned int variable = 0; 
volatile unsigned int print_variable = 0; 

void alarm_handler(int signum) 
{ 
    variable++; 
    print_variable = 1; 
    alarm(1); 
} 

int main() 
{   
    signal(SIGALRM, alarm_handler); 
    alarm(1); 

    for (;;) 
    { 
     select(0, NULL, NULL, NULL, NULL); 

     if (print_variable) 
     { 
      printf("Variable = %u\n", variable); 
     } 
    } 
} 

注:錯誤檢查從爲了簡化上述代碼刪去。

一個printf()功能可能被稱爲SIGALRM處理程序中,但在信號處理程序調用非重入函數一般不提倡。


一秒的超時也可以被傳遞到select(),但如果它是由任何信號中斷,附加的邏輯是必要的,以確保所述一個第二超時的剩餘部分被兌現。幸運的是,在Linux上,select()修改了超時值以反映未睡眠的時間量。這允許檢測到中斷情況,然後通過後續呼叫select()完成超時。

例2:使用select()

#include <errno.h> 
#include <stdio.h> 
#include <sys/select.h> 

volatile unsigned int variable = 0; 

int main() 
{ 
    struct timeval tv; 
    int val; 

    for (;;) 
    { 
     tv.tv_sec = 1; 
     tv.tv_usec = 0; 

     do 
     { 
      val = select(0, NULL, NULL, NULL, &tv); 
     } while (val != 0 && errno == EINTR); 

     printf("Variable = %u\n", ++variable); 
    } 
} 
4

不要使用忙等待,因爲你已經有了100%的CPU使用率。 必須使用系統功能,其變成處理進入睡眠模式,例如select()

#include <stdio.h> 
#include <sys/select.h> 

void your_callback() 
{ 
    printf("%s\n", __FUNCTION__); 
} 

int main() 
{ 
    struct timeval t; 

    while (1) { 
     t.tv_sec = 1; 
     t.tv_usec = 0; 

     select(0, NULL, NULL, NULL, &t); 

     your_callback(); 
    } 

    return 0; 
} 
0

一個簡單的例子,其打印變量a的值對每1秒:

#include<stdio.h> 

void main(void) 
{ 
    int a = 10; 
    while(a--) 
    { 
    printf("Value of a = %d\n", a); 
    sleep(1); 
    } 

} 

輸出:

a = 9的值 ...
a = 0的值