Win32控制台中使用定时器的方法

来源:互联网 发布:获取windows权限 编辑:程序博客网 时间:2024/05/24 23:14

在MFC中用OnTimer()函数就可以很方便的实现定时事件,但在Win32控制台工程中没有消息循环,MSDN里也不推荐把SetTimer()用在Console Applications里。

同理,在DLL工程中创建定时器也需用这种方法,因为DLL没有窗口,没窗口就没有消息循环,没消息循环就收到不到定时消息。如果DLL有窗口的话,就可以在SetTimer()时指定窗口句柄也行,直接用GetForegroundWindow()得到句柄。

方法:在一个单独的线程中创建定时器,再通过指定的回调函数来处理定时事件。

#include <stdio.h>#include <windows.h>#include <conio.h>UINT cnt = 0;//定时器回调函数void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime);//线程回调函数DWORD CALLBACK ThreadProc(PVOID pvoid);  //主函数int main(){    //创建线程    DWORD dwThreadId;      HANDLE hThread = CreateThread(NULL, 0, ThreadProc, 0, 0, &dwThreadId);     printf("hello, thread start!\n");        //得到键盘输入后再退出    getch();           return 0;}    //线程DWORD CALLBACK ThreadProc(PVOID pvoid){    //强制系统为线程简历消息队列    MSG msg;    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);         //设置定时器    SetTimer(NULL, 10, 1000, TimeProc);        //获取并分发消息    while(GetMessage(&msg, NULL, 0, 0))    {        if(msg.message == WM_TIMER)        {            TranslateMessage(&msg);    // 翻译消息            DispatchMessage(&msg);     // 分发消息        }    }        KillTimer(NULL, 10);    printf("thread end here\n");    return 0;}//定时事件void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime){    cnt ++;    printf("thread count = %d\n", cnt);}

0 0
原创粉丝点击