当前位置: 首页 > news >正文

MFC多线程编程做时间显示程序

  1. 主要参考:http://blog.csdn.net/qq61394323/article/details/9328301
  2. 略有改动。
  3. 建立一个基于对话框的工程MultiThread1,在对话框IDD_MULTITHREAD1_DIALOG中加入两个按钮和一个编辑框,两个按钮的ID分别是IDC_START,IDC_STOP ,标题分别为“启动”,“停止”,IDC_STOP的属性选中Disabled;编辑框的ID为 IDC_TIME ,属性选中Read-only;    
  4. 在MultiThread1Dlg.h文件中添加线程函数声明: void ThreadFunc();  
  5.   
  6. 注意,线程函数的声明应在类CMultiThread1Dlg的外部。 在类CMultiThread1Dlg内部添加protected型变量: HANDLE hThread;  
  7. DWORD ThreadID;  
  8. 分别代表线程的句柄和ID。   
  9. 在MultiThread1Dlg.cpp文件中添加全局变量 m_bRun : volatile BOOL m_bRun;  
  10. m_bRun 代表线程是否正在运行。  
  11. 你要留意到全局变量 m_bRun 是使用 volatile 修饰符的,volatile 修饰符的作用是告诉编译器无需对该变量作任何的优化,即无需将它放到一个寄存器中,并且该值可被外部改变。对于多线程引用的全局变量来说,volatile 是一个非常重要的修饰符。  
  12.   
  13. 编写线程函数: void ThreadFunc()  
  14. {    
  15. CTime time;  
  16. CString strTime;  
  17. m_bRun=TRUE;  
  18. while(m_bRun)  
  19. {  
  20. time=CTime::GetCurrentTime();  
  21. strTime=time.Format("%H:%M:%S");  
  22. ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);  
  23. //在vc6.0以后的版本中不支持AfxGetMainWnd()->m_hWnd来获取HWND,所以需要把这一句改为:
  24. ::SetDlgItemText(AfxGetApp()->m_pMainWnd->m_hWnd,IDC_TIME, strTime);
  25. Sleep(1000);  
  26. }  
  27. }  
  28. 该线程函数没有参数,也不返回函数值。只要m_bRun为TRUE,线程一直运行。  
  29. 双击IDC_START按钮,完成该按钮的消息函数: void CMultiThread1Dlg::OnStart()   
  30. {  
  31. // TODO: Add your control notification handler code here   
  32. hThread=CreateThread(NULL,  
  33. 0,  
  34. (LPTHREAD_START_ROUTINE)ThreadFunc,  
  35. NULL,  
  36. 0,  
  37. &ThreadID);  
  38. GetDlgItem(IDC_START)->EnableWindow(FALSE);  
  39. GetDlgItem(IDC_STOP)->EnableWindow(TRUE);  
  40. }  
  41.   
  42. 双击IDC_STOP按钮,完成该按钮的消息函数: void CMultiThread1Dlg::OnStop()   
  43. {  
  44. // TODO: Add your control notification handler code here  
  45. m_bRun=FALSE;  
  46. GetDlgItem(IDC_START)->EnableWindow(TRUE);  
  47. GetDlgItem(IDC_STOP)->EnableWindow(FALSE);  
  48. }  

  49. 编译并运行该例程,体会使用Win32 API编写的多线程。   

相关文章:

  • 范围for循环(c++ primer 笔记)
  • 转换到 COFF 期间失败: 文件无效或损坏
  • MFC中使用OLE/COM操作EXCEL的方法
  • 半导体器件的分类
  • IGBT是什麽
  • Windows系统字符集及各种字符转换函数(长期填坑)
  • COM组件图解(长期填坑)
  • TreeControl的使用笔记
  • Teach yourself Programing in Ten Years(翻译+原文链接)
  • android-serialport-api源码(c代码部分)
  • PBRT读书笔记(一)
  • Qt实用技巧:会呼吸的痛(呼吸点/呼吸灯)(转载)
  • Windows系统键盘钩子(原创)
  • C++语言联邦
  • InitApplication和InitInstance
  • 2019年如何成为全栈工程师?
  • JS 面试题总结
  • JS变量作用域
  • js数组之filter
  • js正则,这点儿就够用了
  • magento 货币换算
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Theano - 导数
  • 从输入URL到页面加载发生了什么
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 模型微调
  • 前嗅ForeSpider中数据浏览界面介绍
  • 巧用 TypeScript (一)
  • 新版博客前端前瞻
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 栈实现走出迷宫(C++)
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • # 计算机视觉入门
  • $refs 、$nextTic、动态组件、name的使用
  • (16)Reactor的测试——响应式Spring的道法术器
  • (3)nginx 配置(nginx.conf)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (六)软件测试分工
  • (三)mysql_MYSQL(三)
  • (实战篇)如何缓存数据
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)Mysql的优化设置
  • (转)scrum常见工具列表
  • (转)详解PHP处理密码的几种方式
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (转载)虚函数剖析
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net 生成二级域名
  • .net 怎么循环得到数组里的值_关于js数组