0
SetTimer 함수로 만든 타이머의 현재 진행 상태를 확인할 방법이 있습니까?SetTimer()로 만든 타이머의 진행을 얻는 방법
SetTimer 함수로 만든 타이머의 현재 진행 상태를 확인할 방법이 있습니까?SetTimer()로 만든 타이머의 진행을 얻는 방법
다음은 한스 주석의 구현입니다. 버튼을 클릭하면 다음 예약 (예상) WM_TIMER 메시지까지 남은 시간이 표시됩니다. 디버그 모드로 구축하면 GUI와 콘솔을 모두 얻는 것이 쉽고 (읽기 : 더러운) 방식이기 때문에 메시지를 표시 할 콘솔을 얻게됩니다.
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"
당신이 '현재 진행'무엇을 의미합니까? (a) 처음 생성 된 이후의 기간 또는 (b) 마지막으로 실행 된 이후의 시간 또는 (c) 다음에 실행될 때까지의 기간을 확인 하시겠습니까? – enhzflep
아니요. 타이머를 시작할 때 GetTickCount()의 반환 값을 변수에 저장합니다. WM_TIMER 핸들러에서 업데이트하십시오. 이제 GetTickCount()에서 변수 값을 빼는 방법으로 시간이 얼마나 남았는지 항상 알 수 있습니다. –
GetTickCount()가있는 솔루션은 합리적인 것처럼 보입니다. 구현하자마자 응답을 추가하겠습니다. –