目标:启动一个定时器实现2秒打印一个字符串。按下Esc键结束程序:
本次使用的依旧是那个demo
这个是一个设置定时器函数
void TestSetTimer::SetTimerTest()
{
MSG msg;
time_t first_t, end_t;
first_t = time(NULL);
if (SetTimer(NULL, 1, 2000, (TIMERPROC)TimerProc))
{
cout << "setTimer start!" << endl;
}
while (GetMessage(&msg, NULL, 0, 0))
{
DispatchMessage(&msg);
}
end_t = time(NULL);
cout << "the difference is " << difftime(end_t, first_t) << " seconds" << endl;
KillTimer(NULL, 1);
}
这个函数是启动定时器,是一个windows.h中的函数, 具体定义可以去看源码。这里简单说一下:
第一个参数是句柄,第二个参数是定时器ID,第三个参数是定时时长,第四个参数是回调函数,也就是定时器到时间执行的函数。
if (SetTimer(NULL, 1, 2000, (TIMERPROC)TimerProc))
{
cout << "setTimer start!" << endl;
}
这个是回调函数:
有一点注意就是函数名可以改变,其他的一律不得改变。
void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
cout << "Timer is running!"<<endl;//定时器时间到,强出一对话框,表明定时器已经运行。
}
这段代码是循环执行定时器中的回调函数。
while (GetMessage(&msg, NULL, 0, 0))
{
DispatchMessage(&msg);
}
然后起一个线程执行定时器函数:
thread t1([]() {
TestSetTimer tt;
tt.SetTimerTest();
});
t1.detach();
循环检测键盘:需要添加头文件#include <conio.h>
Esc键的码是27,所以ch==27就退出。
while (1)
{
if (_kbhit())
{
int ch = _getch();
cout << ch << endl;
if (ch == 27)
{
break;
}
else if (ch == 99)
{
}
}
}