在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. Mosquitto----服务器日志

    客户端连接日志 1403334375: New connection from 121.201.8.163 on port 1883. 1403334375: New client connected ...

  2. xaf 自定义登陆页

    web    Model.xafml   view      AuthenticationStandardLogonParameters_DetailView https://documentatio ...

  3. 停掉一台服务器,Nginx响应慢(转载)

    测试发现的问题及解决办法 1.当后端两台IIS应用服务器都正常时,访问速度非常快,查看日志,原来一个请求,是后端两台服务器同时响应的; 2.为了模仿故障测试,停掉一台IIS应用服务器,这时再访问,请求 ...

  4. 让HttpClient不要打印巨多的日志

    让HttpClient不要打印巨多的日志 log4j.logger.org.apache.commons.httpclient=DEBUG 參考http://hc.apache.org/httpcli ...

  5. jquery获取tr并更改tr内容

    jquery获取tr并更改tr内容示例代码. 例子: $(document).ready(function() { $("#Email tr").each(function(){ ...

  6. Windows下ADB默认的5037port被占用,解决方式。

    Windows下可能会因为系统版本号不一样的原因导致有的系统5037port被系统进程占用.导致ADB无法使用5037port,从而导致ADB不能打开.在eclipse上跑Android程序的时候显示 ...

  7. vs code git 扩展失败,提示重新加载的解决办法

    Git扩展的的问题,通过shift+command+p执行SCM: Disable Preview来回退,会发现图标被还原了,然后世界就安静了,参见更新文档里关于该问题的解释:

  8. layui关闭layer.open打开的页面

    var index = parent.layer.getFrameIndex(window.name); //获取窗口索引parent.layer.close(index);

  9. json中把非json格式的字符串转换成json对象再转换成json字符串

    JSON.toJson(str).toString()假如key和value都是整数的时候,先转换成jsonObject对象,再转换成json字符串

  10. 2.重学javascript 对象和数组

    什么是对象,其实就是一种类型,即引用类型. 一.创建Object类型有两种. ①使用new运算符 <script type="text/javascript"> var ...