可等待计时器
来源:互联网 发布:博士国家电网北京知乎 编辑:程序博客网 时间:2024/05/18 00:29
该内核对象类似于计时器。当然,它和用户模式下的计时器是有区别的。
使用CreateWaitableTimer函数可以创建一个可等待计时器内核对象。用SetWaitableTimer函数来对可等待计时器内核对象进行设置。另外可等待计时器内核对象还可以以异步(Asynchronous)方式调用函数(APC)。基本上都可以给它传递NULL。
我比较喜欢使用事件内核对象和可等待计时器内核对象配合使用。否则前面学习的计时器内核对象就白学了:-)。
下面给出没有任何注释的代码,因为代码很简单,很容易看懂,这是在Windows Live Writer中写的,所以没有代码模式:
#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HWND g_hWnd;
HANDLE g_hTimer,g_hEvt;
DWORD WINAPI WTThreadWatch(PVOID pvParam)
{
static int yCur=0,nTimes=0;
HDC hdc;
TCHAR szBuf[1024]={0};
g_hEvt=CreateEvent(NULL,FALSE,FALSE,NULL);
while(TRUE)
{
WaitForSingleObject(g_hTimer,INFINITE);
SetEvent(g_hEvt);
hdc=GetDC(g_hWnd);
_stprintf_s(szBuf,_countof(szBuf),TEXT("This is the %d times WaitableTimer actived"),nTimes);
TextOut(hdc,250,0,szBuf,_tcslen(szBuf));
//yCur+=20;
nTimes++;
ReleaseDC(g_hWnd,hdc);
}
return 0;
}
DWORD WINAPI WTThreadActive(PVOID pvParam)
{
static BOOL bFlag=FALSE;
HDC hdc;
TCHAR szMsg[16]=TEXT("Actived");;
hdc=GetDC(g_hWnd);
while(1)
{
WaitForSingleObject(g_hEvt,INFINITE);
UpdateWindow(g_hWnd);
if(bFlag)
{
_tcsrev(szMsg);
TextOut(hdc,0,0,szMsg,_tcslen(szMsg));
bFlag=FALSE;
}
else
{
_tcsrev(szMsg);
TextOut(hdc,0,20,szMsg,_tcslen(szMsg));
bFlag=TRUE;
}
}
return 0;
}
int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE,PTSTR,int)
{
TCHAR szWndClass[]=TEXT("Waitable Timer");
WNDCLASSEX wc;
wc.cbClsExtra=0;
wc.cbSize=sizeof(wc);
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_HAND);
wc.hIconSm=LoadIcon(NULL,IDI_HAND);
wc.lpszClassName=szWndClass;
wc.lpfnWndProc=WndProc;
wc.hInstance=hInstance;
wc.lpszMenuName=NULL;
wc.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClassEx(&wc))
{
MessageBox(NULL,TEXT("Can not register class."),TEXT(""),MB_OK);
return -1;
}
g_hWnd=CreateWindowEx(0,szWndClass,TEXT("Waitable Timer Kernel Object"),WS_OVERLAPPED|WS_SYSMENU,CW_USEDEFAULT,CW_USEDEFAULT,500,800,NULL,NULL,hInstance,NULL);
if(!g_hWnd)
{
MessageBox(NULL,TEXT("Can not create window"),TEXT(""),MB_OK);
return -1;
}
ShowWindow(g_hWnd,SW_SHOWNORMAL);
UpdateWindow(g_hWnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm;
static int cxChar=0,cyChar=0;
SYSTEMTIME st={0};
FILETIME ftLocal,ftUTC;
LARGE_INTEGER liTime;
switch(nMsg)
{
case WM_CREATE:
st.wYear=2009;
st.wMonth=9;
st.wDay=1;
st.wHour=20;
st.wMinute=6;
st.wSecond=0;
st.wMilliseconds=0;
SystemTimeToFileTime(&st,&ftLocal);
LocalFileTimeToFileTime(&ftLocal,&ftUTC);
liTime.HighPart=ftUTC.dwHighDateTime;
liTime.LowPart=ftUTC.dwLowDateTime;
hdc=GetDC(hWnd);
cxChar=GetTextMetrics(hdc,&tm);
cxChar=tm.tmAveCharWidth;
cyChar=tm.tmHeight+tm.tmExternalLeading;
g_hTimer=CreateWaitableTimer(NULL,FALSE,NULL);
SetWaitableTimer(g_hTimer,&liTime,(LONG)10*1000,NULL,NULL,FALSE);
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
return 0;
case WM_LBUTTONDOWN:
CreateThread(NULL,0,WTThreadWatch,NULL,0,NULL);
CreateThread(NULL,0,WTThreadActive,NULL,0,NULL);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
- 可等待计时器
- 可等待的计时器
- 可等待的计时器与APC调用
- 可等待的计时器内核对象
- 内核对象--可等待计时器WaitableTimer(一)
- 内核对象--可等待计时器WaitableTimer(二)
- 多线程 -- 可等待的计时器内核对象
- 20170716Windows11_3_可等待计时器对象
- 白话windows多线程同步之可等待计时器内核对象
- 可等待计时器内核对象的使用(CreateWaitableTimer)
- windows核心编程-可等待的计时器内核对象
- Chapter09-“内核模式下的线程同步”之可等待的计时器内核对象
- 线程同步——内核对象(互斥、事件、信号量、可等待计时器)
- JavaScipt可控制计时器
- 线程同步之可等的计时器
- js实现可刷新的简易计时器
- 计时器、Times(倒计时) 主要应用于注册和等待加载
- 《Windows核心编程》---可等待定时器
- 文献
- MYSql命令
- 关于使用VNC帮助windows远程桌面登录LINUX的方法(CentOS5.5已验证)
- 输入一个字符串的anagram的C#算法
- java.math.BigDecimal的用法
- 可等待计时器
- oracle logminer实用工具-分析redo log
- php如何截取字符串并以零补齐str_pad() 函数
- JSF2.0遇到的关于backbean一个BUG
- Linux设备模型之tty驱动架构分析
- CentOS 5.5上编译安装wesnoth 1.8.5,菜单乱码解决
- 转:在Keil MDK环境下使用STM32 V3.4库“小”教程
- Android应用程序的内存分析
- C#程序实现动态调用DLL的研究