таймеры в win32, c ++ - PullRequest
       2

таймеры в win32, c ++

1 голос
/ 05 октября 2010

У меня есть класс таймера, который использует CreateTimerQueueTimer и DeleteTimerQueueTimer. Я получаю обратные вызовы к объектам класса, как и ожидалось. Как я могу убедиться, что таймер не срабатывает, когда приложение занято рисованием пользовательского интерфейса или делает некоторые интенсивные рендеры и т.д ?? Меня не беспокоит высокое разрешение, просто оно должно срабатывать, когда приложение бездействует.

Я использую следующее для создания таймера.

BOOL timerCreated = ::CreateTimerQueueTimer(&mTimerRef,
                                            NULL,
                                            TimerCallback,
                                            (PVOID)(this),
                                            inFireDelay * 1000,
                                            inInterval * 1000,
                                            WT_EXECUTEINUITHREAD);
// using timer queues because i dont have access to a hWnd in this class.

Извините, я не могу использовать только MFC / .NET win32.

Спасибо, Абхинай.

Ответы [ 2 ]

3 голосов
/ 05 октября 2010

Это вообще невозможно.Обратный вызов выполняется в потоке потоков, вы не можете размахивать волшебным флагом и спрашивать «не стреляйте, пожалуйста».Даже если бы это было возможно, это неизбежное состояние гонки, поток, возможно, уже был запущен, но еще не получил возможности выполнить.

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

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

0 голосов
/ 05 октября 2010

WRT: // using timer queues because i dont have access to a hWnd in this class.

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

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

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