2014-10-31 1 views
0

Есть ли способ получить текущий ход таймера, который создается функцией SetTimer?Как получить ход таймера, созданного с помощью SetTimer()

+0

Что вы имеете в виду под 'текущий прогресс'? Вы хотите узнать (а), как долго это было изначально создано, или (б), как долго он длился последний или (в), как долго он будет срабатывать дальше? – enhzflep

+2

Нет. Сохраните возвращаемое значение GetTickCount() в переменной при запуске таймера. Обновите его в обработчике WM_TIMER. Теперь вы всегда знаете, сколько осталось времени, просто вычитая это значение переменной из GetTickCount(). –

+0

Решение с GetTickCount() кажется разумным, я добавлю ответ, как только я его реализую. –

ответ

1

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

main.cpp

#include <windows.h> 
#include <commctrl.h> 
#include <stdio.h> 
#include "resource.h" 

HINSTANCE hInst; 

DWORD tickCountInitial; 
DWORD timerInterval = 10000; 
DWORD nextTimerFired; 

BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 
     case WM_INITDIALOG: 
     { 
      tickCountInitial = GetTickCount(); 
      SetTimer(hwndDlg, 666, timerInterval, NULL); 
      nextTimerFired = tickCountInitial + timerInterval; 
     } 
     return TRUE; 

     case WM_TIMER: 
     { 
      DWORD tickCountCurrent = GetTickCount(); 
      printf("Ticks elapsed: %d\n", tickCountCurrent - tickCountInitial); 
      nextTimerFired = tickCountCurrent + timerInterval; 
      MessageBeep(MB_OK); 
     } 
     return 0; 

     case WM_CLOSE: 
     { 
      EndDialog(hwndDlg, 0); 
     } 
     return TRUE; 

     case WM_COMMAND: 
     { 
      switch(LOWORD(wParam)) 
      { 
       case IDC_BUTTON1: 
       { 
        DWORD tickCountCurrent = GetTickCount(); 
        printf("Ticks till next WM_TIMER message: %d\n", nextTimerFired - tickCountCurrent); 
       } 
       break; 
      } 
     } 
     return TRUE; 
    } 
    return FALSE; 
} 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    hInst=hInstance; 
    InitCommonControls(); 
    return DialogBox(hInst, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DlgMain); 
} 

resource.h

#ifndef IDC_STATIC 
#define IDC_STATIC (-1) 
#endif 

#define DLG_MAIN        100 
#define IDC_BUTTON1        40000 

resource.rc

// Generated by ResEdit 1.6.2 
// Copyright (C) 2006-2014 
// http://www.resedit.net 

#include <windows.h> 
#include <commctrl.h> 
#include <richedit.h> 
#include "resource.h" 




// 
// Dialog resources 
// 
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
DLG_MAIN DIALOG 0, 0, 186, 95 
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU 
CAPTION "Dialog" 
FONT 8, "Ms Shell Dlg" 
{ 
    PUSHBUTTON  "Check Remaining", IDC_BUTTON1, 41, 32, 104, 31, 0, WS_EX_LEFT 
} 



// 
// Manifest resources 
// 
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
1     RT_MANIFEST ".\\manifest.xml" 
Смежные вопросы