Привет! Прога на C, но вопрос общий. Происходит наслоение сообщений таймера. Вот грубый пример. //окна выскакивают без остановки void OnTimer() { MessageBox(hMainWnd, "Таймер. ", szCaption, MB_ICONERROR|MB_OK); ... //окна тоже выскакивают без остановки. почему это не работает? CRITICAL_SECTION ScanCS; InitializeCriticalSection(&ScanCS); void OnTimer() { EnterCriticalSection(&ScanCS); MessageBox(hMainWnd, "Таймер. ", szCaption, MB_ICONERROR|MB_OK); LeaveCriticalSection(&ScanCS); ... //а это работает bool Timer = false; void OnTimer() { if (Timer) return; Timer = true; MessageBox(hMainWnd, "Таймер. ", szCaption, MB_ICONERROR|MB_OK); Timer = false; ... Как решать эту проблему грамотно? Кто-нибудь, обьясните как работает система в этом случае. Она что, не ждет обработки сообщения в OnTimer()? Если не ждет, почему Sleep() вместо MessageBox() тормозит, но лишних вызовов OnTimer() вроде нет.
demidov Похоже что MessageBox не тормозит обработку сообщений главного окна, то есть где-то в недрах MessageBox-a есть метод который передаёт управление главному окну, и это правильно. Можешь тормознуть таймер при входе в процедуру, и перед выходом снова запустить, или делай как делал ты в последнем примере.
Спасибо. Остается непонятно почему при Sleep() наслоения, вроде, не происходит. if (Timer) { dbg(" return"); return; } ничего не дает. Видимо, с MessageBox-ом неудачный пример. У меня просто долгая обработка данных в OnTimer(). Может ли "забиться" очередь сообщений? ... Вот еще нашел в MSDN: "The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions post this message only when no other higher-priority messages are in the thread's message queue." Похоже, с WM_TIMER проблем быть не должно...
MessageBox создает внутри цикл обработки сообщений, поэтому функция вызывается повторно а насчет очереди - хз попробуй, проверь
Cообщения WM_TIMER спариваются, то есть по идее они накапливаться не должы, а всегда только те время которых ещё не пришло.