Создание тайм-аута с использованием времени и разницы - PullRequest
1 голос
/ 29 апреля 2011
gcc (GCC) 4.6.0 20110419 (Red Hat 4.6.0-5)

Я пытаюсь узнать время начала и окончания.И получите разницу между ними.

У меня есть функция для создания API для нашего существующего оборудования.

API wait_events принимает один аргумент - время в миллисекундах.Так что я пытаюсь получить начало до цикла пока.И используя время, чтобы получить количество секунд.Затем после 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

Ответы [ 2 ]

5 голосов
/ 29 апреля 2011

Вы слишком усложняете это - упрощенно:

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

time_t в общем случае должно быть просто int или long int в зависимости от вашей платформы, считающей количество секунд с 1 января 1970 года.

Примечание:

int timeout = timeout_ms / 1000;

Одна секунда состоит из 1000 миллисекунд.

Редактировать - еще одно примечание: вам, скорее всего, придется убедиться, что другой поток (ы)) и / или обработка событий может происходить, поэтому включите некоторую неактивность потоков (используя sleep(), nanosleep() или что-либо еще).

1 голос
/ 29 апреля 2011

Без вызова функции Sleep () это действительно плохой дизайн: ваш цикл будет использовать 100% ЦП.Даже если вы используете потоки, ваши другие потоки не будут иметь много времени для запуска, так как этот поток будет использовать много циклов ЦП.Вы должны создать что-то вроде этого:

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

Если вам нужна точность синхронизации и вы используете разные потоки / процессы, используйте мьютексы ( семафоры с приращением / уменьшением 1) илиКритические разделы, чтобы убедиться, что сравнение времени вашей функции не прерывается другим вашим процессом / потоком.Я считаю, что ваша Red Hat System V , поэтому вы можете синхронизировать, используя IPC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...