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

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

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

  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <conio.h>
  4. UINT cnt = 0;
  5. //定时器回调函数
  6. void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime);
  7. //线程回调函数
  8. DWORD CALLBACK ThreadProc(PVOID pvoid);
  9. //主函数
  10. int main()
  11. {
  12. //创建线程
  13. DWORD dwThreadId;
  14. HANDLE hThread = CreateThread(NULL, 0, ThreadProc, 0, 0, &dwThreadId);
  15. printf("hello, thread start!\n");
  16. //得到键盘输入后再退出
  17. getch();
  18. return 0;
  19. }
  20. //线程
  21. DWORD CALLBACK ThreadProc(PVOID pvoid)
  22. {
  23. //强制系统为线程简历消息队列
  24. MSG msg;
  25. PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
  26. //设置定时器
  27. SetTimer(NULL, 10, 1000, TimeProc);
  28. //获取并分发消息
  29. while(GetMessage(&msg, NULL, 0, 0))
  30. {
  31. if(msg.message == WM_TIMER)
  32. {
  33. TranslateMessage(&msg);    // 翻译消息
  34. DispatchMessage(&msg);     // 分发消息
  35. }
  36. }
  37. KillTimer(NULL, 10);
  38. printf("thread end here\n");
  39. return 0;
  40. }
  41. //定时事件
  42. void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime)
  43. {
  44. cnt ++;
  45. printf("thread count = %d\n", cnt);
  46. }
#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控制台中使用定时器的方法的更多相关文章

  1. Winfrom和控制台中static修饰方法的问题

    在编写winform程序时,当写完方法名后,按Shift+Alt+F10(vs自动生成方法框架)后生成的方法是实例方法,而当手动为该方法添加static修饰符后,程序仍能正常运行. 而在控制台中,写完 ...

  2. Java初学者作业——编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字。

    返回本章节 返回作业目录 需求说明: 编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字. 实现思路: 定义方法findNums(),用于实现查找所有能够整除指定数 ...

  3. 在 C# 控制台中记录异常日志并输出

    最近做了一个小程序,要求在控制台中记录程序运行的异常并输出到指定的文件夹中,以下是我的具体的程序代码: public static void ErrorLog(Exception ex) { stri ...

  4. 转:在控制台中调试AngularJS应用

    在控制台中调试AngularJS应用 在创建AngularJS应用时,一个很棘手的问题是如何在Chrome,Firefox,以及IE的JavaScript控制台中访问深藏在应用中的数据和服务.本文将会 ...

  5. ASP.NET Web API实践系列09,在Fiddler和控制台中模拟GET和POST请求

    ASP.NET Web API本质是由一个进程托管的一组类,需要宿主,这个宿主可以是ASP.NET应用程序,可以是MVC项目,可以是控制台应用程序,也可以是自己定制的宿主. 在VS2012中创建一个& ...

  6. 在控制台中输出 ASP.NET 网站的跟踪信息

    实现方法: 1. 可以在 C# 代码中调用 System.Diagnostics.Debug.WriteLine() 来实现. 其效果类似于在控制台应用程序中调用 Console.WriteLine( ...

  7. .NET CORE 怎么样从控制台中读取输入流

    .NET CORE 怎么样从控制台中读取输入流 从Console.ReadList/Read 的源码中,可学习到.NET CORE 是怎么样来读取输入流. 也可以学习到是如何使用P/Invoke来调用 ...

  8. ESP8266_04管脚控制与软件定时器

    ESP8266_04管脚控制与软件定时器 from :https://mp.weixin.qq.com/s/APawDx4io4gKJyOeuErTLA 原创: MCU启航 单片机爱好者 今天 这一节 ...

  9. .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中

    目录 .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中 前言 笔者最近在开发和维护一个.NET Core项目,其中使用几个非常有意思的.NET Core相关的扩展,在 ...

随机推荐

  1. MySQL学习总结(二)数据库以及表的基本操作

    上一节中详细的介绍了关于MySQL数据库的安装过程,接下来我们就该对数据库以及表进行一些基本的操作了. 1.数据类型 MySQL数据库中提供了整数类型.浮点数类型.定点数类型.日期和时间类型.字符串类 ...

  2. zeroclipboard解决跨域问题

    ZeroClipboard.setDefaults({ moviePath: "//d2glos6gx2bw40.cloudfront.net/C8QpR9/images/flash/Zer ...

  3. (Spring Boot框架)快速入门

    Spring Boot 系列文章推荐 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring Boot 静态资源处理 今天介绍一 ...

  4. 在MAC上安装Oracle JDK

    下载Mac版本的JDKhttp://www.oracle.com/technetwork/java/javase/downloads/index.html 下载之后,双击dmg文件安装 mac 下查看 ...

  5. Vim-复制选中内容至系统剪贴板,光标移动到指定行的行首和行尾

    1.全选并复制到系统剪贴板 ggVG或ggvG 然后 "+y gg 让光标移到首行,在vim才有效,vi中无效 V 是进入Visual(可视)模式 G 光标移到最后一行 "+y 复 ...

  6. redis使用场景介绍

    一:缓存——热数据 热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了 ...

  7. lua工具库penlight--02表和数组

    类Python的List lua的优美之处在于把数组和关联数组都用table实现了(Python中叫list和dict,C++中叫vector和map). 一般我们把数字索引的table叫做list. ...

  8. sql row_number 用法

    自己研究了一下RowNum ,发现这样的分页挺清晰的 --第几页,一页多少行declare @PageIndex int,@PageMax intset @PageIndex =1set @PageM ...

  9. Enlish相关术语

    APM 自动编程机(Automatic Programming Machine) 高级电源管理(Advanced Power Management) OSD 屏幕显示(On Screen Displa ...

  10. Swing与AWT在事件模型处理上是一致的

    Swing与AWT在事件模型处理上是一致的. Jframe实际上是一堆窗体的叠加. Swing比AWT更加复杂且灵活. 在JDK1.4中,给JFRAME添加Button不可用jf.add(b).而是使 ...