2011-04-29 188 views
1
gcc (GCC) 4.6.0 20110419 (Red Hat 4.6.0-5) 

我想获取开始和结束时间的时间。并获得它们之间的差异。使用时间和difftime创建超时

我有的功能是为我们现有的硬件创建一个API。

API wait_events带有一个以毫秒为单位的时间参数。所以我想在while循环之前开始。并用时间来获得秒数。然后,循环的1次迭代获得时间差,然后将该差异与超时进行比较。

非常感谢您的任何建议,

/* Wait for an event up to a specified time out. 
* If an event occurs before the time out return 0 
* If an event timeouts out before an event return -1 */ 
int wait_events(int timeout_ms) 
{ 
    time_t start = 0; 
    time_t end = 0; 
    double time_diff = 0; 
    /* convert to seconds */ 
    int timeout = timeout_ms/100; 

    /* Get the initial time */ 
    start = time(NULL); 
    while(TRUE) { 
     if(open_device_flag == TRUE) { 
      device_evt.event_id = EVENT_DEV_OPEN; 
      return TRUE; 
     } 
     /* Get the end time after each iteration */ 
     end = time(NULL); 
     /* Get the difference between times */ 
     time_diff = difftime(start, end); 
     if(time_diff > timeout) { 
      /* timed out before getting an event */ 
      return FALSE; 
     } 
    } 
} 

,将调用会是这样的功能。

int main(void) 
{ 
#define TIMEOUT 500 /* 1/2 sec */ 
    while(TRUE) { 
     if(wait_events(TIMEOUT) != 0) { 
      /* Process incoming event */ 
      printf("Event fired\n"); 
     } 
     else { 
      printf("Event timed out\n"); 
     } 
    } 

    return 0; 
} 

===============编辑与更新的结果==================

1) With no sleep -> 99.7% - 100% CPU 
2) Setting usleep(10) -> 25% CPU 
3) Setting usleep(100) -> 13% CPU 
3) Setting usleep(1000) -> 2.6% CPU 
4) Setting usleep(10000) -> 0.3 - 0.7% CPU 

回答

4

你它过于复杂 - 简单:

time_t start = time(); 
for (;;) { 
    // try something 
    if (time() > start + 5) { 
     printf("5s timeout!\n"); 
     break; 
    } 
} 

time_t一般应该只是一个intlong int根据您的平台,因为1月1日统计的秒数在1970年

旁注:

int timeout = timeout_ms/1000; 

一秒由1000毫秒。

编辑 - 另注: 你最有可能,以确保其他线程(S)和/或事件处理可能发生的,所以包括某种线程闲置(使用sleep()nanosleep()或其他)。

+0

你好马里奥。这工作。谢谢。是的,这将是一个多线程应用程序。所以在我正在检查时间的while循环中。我应该在那里休息以暂停当前线程,以便其他线程可以发生。但是,如果这是多线程的话。无论如何,这些线程会发生,因为它们会在另一个线程中?你是这个意思吗?谢谢。 – ant2009 2011-04-29 19:52:15

+1

他们应该(真的取决于您的操作系统的调度程序),但即使它闲置,您的应用程序仍将保持100%,这可能会减慢您等待的其他线程。如果你不想冒任何缓慢的风险,只需等待0毫秒。这听起来很愚蠢,但它会为操作系统提供一个方便的地方,即使您根本不在等待(在纸上),它也可以任务切换和处理事件。 – Mario 2011-04-29 20:31:47

+0

你好马里奥,我更新了一些更新后的结果。你会说哪一个是最适合你的睡眠?谢谢。 – ant2009 2011-05-01 06:13:10

1

没有调用Sleep()函数,这是一个非常糟糕的设计:您的循环将使用100%的CPU。即使你正在使用线程,你的其他线程也没有太多时间运行,因为这个线程将使用很多CPU周期。 您应该设计这样的事情:

while(true) { 
    Sleep(100); // lets say you want a precision of 100 ms 
    // Do the compare time stuff here 
} 

如果你需要时间的精确度,并且使用不同的线程/进程,使用互斥(semaphores为1的递增/递减)或临界区,以确保时间您的功能比较不会被您自己的另一个进程/线程中断。 我相信你的红帽是一个System V所以你可以同步使用IPC

+0

您好Dranfi,我确实将睡眠设置为100.我还将此作为我的更新结果显示在我的问题中。谢谢。 – ant2009 2011-05-01 06:13:49

+0

我真的很惊讶你的结果: 设置睡眠(100) - > 13%的CPU。 对于仅循环迭代10次/秒的循环,这仍然是很多CPU周期。 我可以问你在哪个CPU(和OS)上执行这个代码? – dranfi 2011-05-01 06:54:43

+0

Fedora 15 x64,Atom N550 2核心4线程,DDR3 2GB。谢谢。 – ant2009 2011-05-01 10:14:15