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

来源:互联网 发布:软件行业目标市场分析 编辑:程序博客网 时间:2024/04/30 02:11
  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编写的多线程。