Ограничить вхождения события - PullRequest
1 голос
/ 14 мая 2011

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

void WINAPI flash (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
    //MATT: Define the serial port procedure
    HANDLE hSerial;

    //MATT: Fire the flash (by initialising and uninitialising the port)
    hSerial = CreateFile("COM1",GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); CloseHandle(hSerial);
}

Как ограничить минимальный интервал вспышки в миллисекундах (точность в миллисекундах очень важна)?

Ответы [ 3 ]

2 голосов
/ 14 мая 2011

Вы можете использовать простую переменную, которая хранит время, указанное в QueryPerformanceCounter.Точность QPC очень, очень высока на большинстве систем.В моей системе частота составляет 2,8 миллиона или один тик на десять тактовых частот процессора.

class bulb {
    __int64 clocks;
    __int64 frequency;
public:
    static const int max_ms_between_flashes = 1;
    bulb() {
        LARGE_INTEGER li;
        QueryPerformanceFrequency(&li);
        frequency = li.QuadPart;
        clocks = 0;
    }
    void flash(...) {
        LARGE_INTEGER li;
        QueryPerformanceCounter(&li);
        if (clocks == 0) { 
            // We are the first time, so set the clocks var
            // and flash the bulb
            clocks = li.QuadPart;       
        } else {
            __int64 timepassed = clocks - li.QuadPart;
            if (timepassed >= (((double)frequency) / (max_ms_between_flashes * 1000))) {
                // It's been more than 1ms
                clocks = li.QuadPart;
                // flash the bulb
            }
        }
    }
}
2 голосов
/ 14 мая 2011

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

Затем все, что вам нужно сделать, это проверить, что текущее время составляет по крайней мере x миллисекунд после этого времени.

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

0 голосов
/ 14 мая 2011

Если вы можете сохранить миллисекундный интервал между миганиями в глобальной переменной, скажем FLASH_INETRVAL:

void WINAPI flash (HINSTANCE hThisInstance, 
                   HINSTANCE hPrevInstance, 
                   LPSTR lpszArgument, 
                   int nFunsterStil)
    {            
        HANDLE hSerial;
        static long lastFlashMillis;
        // currentTimeMillis() should be defined using a system 
        // call that returns current
        // system time in milliseconds.
        long interval = currentTimeMillis() - lastFlashMillis; 

        if (interval < FLASH_INTERVAL)
            Sleep (interval);
        lastFlashMillis = currentTimeMillis(); 
        //MATT: Fire the flash (by initialising and uninitialising the port)
        hSerial = CreateFile("COM1",GENERIC_WRITE, 0, 0, OPEN_EXISTING, 
                             FILE_ATTRIBUTE_NORMAL, 0); CloseHandle(hSerial);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...