Win32控制台中使用定时器的方法
在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);
- }

#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);
}
jpg改rar
Win32控制台中使用定时器的方法的更多相关文章
- Winfrom和控制台中static修饰方法的问题
在编写winform程序时,当写完方法名后,按Shift+Alt+F10(vs自动生成方法框架)后生成的方法是实例方法,而当手动为该方法添加static修饰符后,程序仍能正常运行. 而在控制台中,写完 ...
- Java初学者作业——编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字。
返回本章节 返回作业目录 需求说明: 编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字. 实现思路: 定义方法findNums(),用于实现查找所有能够整除指定数 ...
- 在 C# 控制台中记录异常日志并输出
最近做了一个小程序,要求在控制台中记录程序运行的异常并输出到指定的文件夹中,以下是我的具体的程序代码: public static void ErrorLog(Exception ex) { stri ...
- 转:在控制台中调试AngularJS应用
在控制台中调试AngularJS应用 在创建AngularJS应用时,一个很棘手的问题是如何在Chrome,Firefox,以及IE的JavaScript控制台中访问深藏在应用中的数据和服务.本文将会 ...
- ASP.NET Web API实践系列09,在Fiddler和控制台中模拟GET和POST请求
ASP.NET Web API本质是由一个进程托管的一组类,需要宿主,这个宿主可以是ASP.NET应用程序,可以是MVC项目,可以是控制台应用程序,也可以是自己定制的宿主. 在VS2012中创建一个& ...
- 在控制台中输出 ASP.NET 网站的跟踪信息
实现方法: 1. 可以在 C# 代码中调用 System.Diagnostics.Debug.WriteLine() 来实现. 其效果类似于在控制台应用程序中调用 Console.WriteLine( ...
- .NET CORE 怎么样从控制台中读取输入流
.NET CORE 怎么样从控制台中读取输入流 从Console.ReadList/Read 的源码中,可学习到.NET CORE 是怎么样来读取输入流. 也可以学习到是如何使用P/Invoke来调用 ...
- ESP8266_04管脚控制与软件定时器
ESP8266_04管脚控制与软件定时器 from :https://mp.weixin.qq.com/s/APawDx4io4gKJyOeuErTLA 原创: MCU启航 单片机爱好者 今天 这一节 ...
- .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中
目录 .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中 前言 笔者最近在开发和维护一个.NET Core项目,其中使用几个非常有意思的.NET Core相关的扩展,在 ...
随机推荐
- 用Visual studio2012在Windows8上开发内核驱动监视线程创建
在Windows NT中,80386保护模式的“保护”比Windows 95中更坚固,这个“镀金的笼子”更加结实,更加难以打破.在Windows 95中,至少应用程序I/O操作是不受限制的,而在Win ...
- Hadoop在线分析处理(OLAP)
数据处理与联机分析处理 ( OLAP ) 联机分析处理是那些为了支持商业智能,报表和数据挖掘与探索等业务而开展的工作.这类工作的样例有零售商按地区和季度两个维度计算门店销售额,银行按语言和月份两个维度 ...
- hadoop修改
https://github.com/medcl/elasticsearch-analysis-ik/releases hadoop-/etc/hadoop/core-site.xml <con ...
- svn move (mv,rename,ren)
svn 重命名文件: [root@NGINX-APACHE-SVN pro]# svn move 20160624新建数据库表.txt 201.txt A 201.txt D 20160624新建数据 ...
- 【高并发简单解决方案】redis缓存队列+mysql 批量入库+php离线整合
原文出处: 崔小拽 需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化 ...
- jquery的liveQuery插件
一.livequery插件简介 jQuery的事件绑定功能使得jQuery代码与HTML代码能够完全分离,这样代码的层次关系更加清晰,维护起来也更加简单.然而对于动态加载到页面的HTML元素,每次都需 ...
- 如何只利用NMAKE+CL+LINK写WIN32程序
关键是1.包含<Windows.h>及其他的相关头文件2.在LINK指令中最起码要加上KERNEL32.LIB USER32.LIB GDI32.LIB(不需要制定其路径,因为NMAKE, ...
- oracle 显示格式化
sqlplus中:set wrap off; set pagesize 1000; set linesize 1000; col id format A20; //该字段最长显示20个字符 col n ...
- lua文件读写
lua里的文件读写模型来自C语言,分为完整模型(和C一样).简单模型. 1.简单模型 io.input([file]) 设置默认的输入文件,file为文件名(此时会以文本读入)或文件句柄(可以理解为 ...
- rt serial 的编写
/* * Copyright (C) 2005-2007 Jan Kiszka <jan.kiszka@web.de>. * * Xenomai is free software; you ...