lock&_lock Ответов: 1

Как справиться с проблемой с бесконечным циклом while в C, не реагируя ?


Следуя моему предыдущему вопросу : Как изменить последовательность с помощью функции mod в C.

У меня есть цикл while, который вычитает прошедшее время, которое я получаю от таймера, и время, когда я нажимаю клавишу (я определил эти клавиши в части ohter в keyEvent), чтобы отобразить различные выходные данные, основанные на задержке.

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

Вот в чем идея :
[Every 10 seconds]
1 2 3 4 5 6 7 8 9 (10) 11 12 13 14 15   (→ 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) (→ 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)

Вот мой цикл while :

Что я уже пробовал:

теперь : время от таймера .
last_event : время нажатия определенной клавиши
задержка : специфическая задержка для каждого ключа
void drawImage(int now, int last_event, int delay){
    while(1)
    {       
        if ((now - last_event) >= delay)
        {
            argDrawImage(image1);
            last_event = now;
        }
    else
        {
            argDrawImage(image2);
            now = arUtilTimer();
        }
    }
}

Который я собираюсь вызвать позже в моем основном цикле. Но я продолжаю получать не отвечающий результат (черный экран). Код работает нормально, и расчет также работает правильно, если я не вызываю свой цикл while. Есть ли какая-то ошибка в моем цикле while ?

0x01AA

Я слишком ленив, чтобы глубоко копаться в вашем коде. Но на первый взгляд а while(1) без break Выглядит очень подозрительно

lock&_lock

это бесконечная петля. Я буду запускать этот цикл до тех пор, пока программа не будет выполнена. Он остановится, если я нажму клавишу Esc, которая также остановит программу. Я обновил свой вопрос, чтобы сделать его более ясным.

1 Ответов

Рейтинг:
1

KarstenK

Они-это а серьезная проблема в вашем цикле: это плохой дизайн. Ваш код работает и использует процессор, делая не так много полезной работы, но препятствуя другой полезной работе, такой как плавное выполнение, и вы теряете энергию.

Использовать обратный вызов таймера для какого-то повторяющегося события.

Но вы должны отправить сообщение или звонок, когда ваши данные изменились. Используйте PostMessage и некоторые другие обработчик сообщений.