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相关的扩展,在 ...
随机推荐
- 破解Aspose 操作pdf word等文档 对10以下版本有效
using System; using System.IO; namespace LicenseHelper { public static class License { public const ...
- 用Reflector for .NET反编译dll文件(.net),把整个dll导出个cs插件
Reflector for .NET 下载地址: http://www.aisto.com/roeder/dotnet/ Reflector.FileDisassembler.zip下载地址: htt ...
- IntelliJ IDEA 学习(二):Intellij IDEA 创建Web项目并在Tomcat中部署运行IDEA
一.创建Web项目 1.File -> New Module,进入创建项目窗口 2.选择Java类型,在 Module name 处输入项目名,点击Next 3.勾选 Web Applicat ...
- int main() 与 int _tmain()
用过C的人都知道每一个C的程序都会有一个main(),但有时看别人写的程序发现主函数不是int main(),而是int _tmain(),而且头文件也不是<iostream.h>而是&l ...
- appium 1.6.3 + ios 10.2 + xcode 8.2.1 真机运行iphone app
appium命令行启动: appium --address "127.0.0.1" --session-override --pre-launch --debug-log-spac ...
- svn lock 锁定文件
[root@NGINX-APACHE-SVN pro]# svn lock zh_CN.UTF-8 'zh_CN.UTF-8' locked by user 'svnroot'. [root@NGIN ...
- MySQL中的Multi-Range Read优化
MySQL 5.6开始支持Multi-Range Read(MRR)优化.目的是味儿减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问,这对IO-bound类型的SQL查询语句可带来性能极大的 ...
- Linux之系统管理员笔记
1.查看最近一次启动时间 who -b system boot -- : 2.who命令实现带有“表头”的查询结果 who -H NAME LINE TIME COMMENT root pts/ -- ...
- 每日英语:When Social Skills Are A Warning
An uncle starts believing all your sarcastic comments. Or a kindhearted friend never understands any ...
- jquery的liveQuery插件
一.livequery插件简介 jQuery的事件绑定功能使得jQuery代码与HTML代码能够完全分离,这样代码的层次关系更加清晰,维护起来也更加简单.然而对于动态加载到页面的HTML元素,每次都需 ...