码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2015-06-20 17:12:32      阅读:326      评论:0      收藏:0      [点我收藏+]

标签:

在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);
}


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

标签:

原文地址:http://blog.csdn.net/jiangqin115/article/details/46573689

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!