Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用time和difftime创建超时_C - Fatal编程技术网

C 使用time和difftime创建超时

C 使用time和difftime创建超时,c,C,我正在尝试获取开始时间和结束时间。并找出它们之间的区别 我的功能是为我们现有的硬件创建一个API API wait_事件采用一个参数,即以毫秒为单位的时间。所以我想在while循环之前开始。用时间来计算秒数。然后在循环的1次迭代之后,得到时间差,然后将该差与超时进行比较 非常感谢您的建议 gcc (GCC) 4.6.0 20110419 (Red Hat 4.6.0-5) 将调用的函数如下所示 /* Wait for an event up to a specified time out.

我正在尝试获取开始时间和结束时间。并找出它们之间的区别

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

API wait_事件采用一个参数,即以毫秒为单位的时间。所以我想在while循环之前开始。用时间来计算秒数。然后在循环的1次迭代之后,得到时间差,然后将该差与超时进行比较

非常感谢您的建议

gcc (GCC) 4.6.0 20110419 (Red Hat 4.6.0-5)
将调用的函数如下所示

/* 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
time\u t
通常应为
int
long int
,具体取决于您的平台自1970年1月1日开始计算的秒数

旁注:

time_t start = time();
for (;;) {
    // try something
    if (time() > start + 5) {
        printf("5s timeout!\n");
        break;
    }
}
一秒钟由1000毫秒组成

编辑-另一个注释: 您很可能必须确保其他线程和/或事件处理可以发生,因此包括某种线程不活动(使用
sleep()
nanosleep()
或其他任何方式)。

如果不调用sleep()函数,这是一种非常糟糕的设计:您的循环将使用100%的CPU。即使您正在使用线程,您的其他线程也不会有太多时间运行,因为该线程将使用许多CPU周期。 你应该这样设计:

int timeout = timeout_ms / 1000;
如果您需要精确的计时,并且正在使用不同的线程/进程,请使用互斥锁(增量/减量为1)或关键部分,以确保函数的时间比较不会被您自己的另一个进程/线程中断。
我相信你的红帽是一个好东西,所以你可以使用

Hello Mario进行同步。成功了。谢谢是的,这将是一个多线程应用程序。在while循环中,我检查时间。我应该在那里放一个睡眠暂停当前线程,以便其他线程可以发生。但是,如果这是多线程。这些线程无论如何都会发生,因为它们会在另一个线程中?这就是你的意思吗?谢谢。它们应该(实际上取决于你的操作系统的调度程序),但是你的应用程序即使处于空闲状态也会保持100%,这可能会减慢你等待的其他线程的速度。如果您不想冒任何减速的风险,请等待0毫秒。这听起来很愚蠢,但它将为操作系统提供一个方便的点,在这个点上,即使你根本不等待(在纸上)。你好,Mario,我用一些更新的结果更新了我的问题。你认为哪一个是你睡觉的最佳选择?谢谢。这真的取决于你想要观察/接受的反应。当然,10秒的超时将导致非常低的CPU负载,但它也将强制10秒的等待时间,这可能会导致程序和/或硬件出现不活动、挂起、无响应或只是。。。慢点。只需选择一个适合您的设计、使用、客户等的合理值。C函数time()只接受一个参数。在没有任何参数的情况下调用它会导致未定义的行为——尽管几乎所有时间它都与time(NULL)相等。这是非常糟糕的,因为时间函数可能会覆盖任何地方的内存。如果你幸运的话,你会得到一个内存冲突。但是,如果有time()的原型可用,编译器应该警告这个问题。我还将其显示为我在问题中的更新结果。谢谢。我对你的结果感到非常惊讶:设置usleep(100)->13%的CPU。对于仅以10次/s迭代的循环来说,这仍然是大量的CPU周期。请问您在哪个CPU(和操作系统)上执行此代码?
while(true) {
  Sleep(100); // lets say you want a precision of 100 ms
  // Do the compare time stuff here
}