Как выполнить Time Loop в C без clock_t или таймера? - PullRequest
0 голосов
/ 14 октября 2018

Я хочу выполнить 2 разных вывода в определенное время в секундах, один за другим.И измените время обмена с помощью keyEvent.Вот идея.

[Every 10 seconds]
1 2 3 4 5 6 7 8 9 (10) 11 12 13 14 15 16 17 18 19 (20)  (→ second-from timer lib.)
Display Output 1 = 1-10 second
Display Output 2 = 11-20 second, (then Output 1 again, etc)

[Every 5 seconds]
1 2 3 4 (5) 6 7 8 9 (10) 11 12 13 14 (15) 16 17 18 19 (20)(→ second-from timer lib.)
Display Output 1 = 1-5 second
Display Output 2 = 6-10 second
Display Output 1 = 11-15 second, (then Output 2 again, etc)

Я искал вопрос, такой как Цикл программы C по времени и Как использовать секунды (время) в программе на C в качестве счетчика? и я нахожу только те с таймером и clock_t.Я не планирую использовать таймер и часы, так как я уже использую библиотеку utilTimer для возврата количества секунд в реальном времени.Вот мой код keyEvent:

if (key == '1' ) {
    delay=10;
}
if (key == '2' ) {
    delay=5;
}
if (key == '3' ) {
    delay=3;
}
if (key == '4' ) {
    delay=1;
}

Как мне реализовать цикл времени?На данный момент для зацикливания я использую mod, но используя mod, вывод выполняется только один раз, когда значение соответствует mod.Также сложно установить максимальное значение цикла, так как я работаю в режиме реального времени.Так что я все еще немного сбит с толку и не достиг своей цели.

for (int count = 0; true; count++) {
    if (count % delay == 0) {
        //push output 1 every defined delay - in seconds
    }
    else {
        //push another output
    }
}

Любой совет?

[РЕДАКТИРОВАТЬ]

Я бегу простойС программой на Mac.По сути, я хочу выдвинуть вывод, в данном случае вывод строки и изображение, поэтому через несколько секунд строка и изображение будут неоднократно меняться.И я хочу иметь возможность контролировать изменение частоты с помощью клавиши.

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Вам необходимо следить за последним изменением изображения и строки.Затем вы вычитаете последний раз из текущего времени, и если разница больше, чем задержка, вы выводите новое изображение и строку, а затем обновляете переменную последнего времени до текущего времени.

Если вы используете unsignedзначения для таймеров, у вас не будет проблем с опрокидыванием (которое будет переполнением для целых чисел со знаком и приведет к неопределенному поведению).

unsigned now;        // from your timer
unsigned last_event; // the last time you sent stuff out
unsigned delay;      // the time between output events

while (1)
{
    if ((now - last_event) >= delay)
    {
        // send out your string and image
        last_event = now;
    }
    else
    {
        // keep waiting, and do whatever else you want
        // update now as appropriate from timer
    }
}

Мое использование while (1) выше предназначено для передачи идеичто код внутри цикла while выполняется часто.Это не обязательно, и, вероятно, на практике это не будет цикл while.Вероятно, это будет

  • Часть «суперцикла» во встроенном приложении
  • Внутри задачи RTOS
  • Внутри большого потока ОС
  • В кадре игровой программы вызывается
  • и т. Д.
0 голосов
/ 14 октября 2018

Если я правильно понял вопрос, вы можете использовать sleep в цикле for.Это в библиотеке unistd.h.

#include unistd.h
for (int count = 0; true; count++) {
    sleep(1000); //sleep for 1 second
    if (count % 10 == 0) {
    //every 10 seconds
    }
    if (count % 5 == 0) {
    //every 5 seconds
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...