设为首页 加入收藏

TOP

14.5 创建线程实例
2013-10-07 01:19:52 来源: 作者: 【 】 浏览:71
Tags:14.5 创建 线程 实例

14.5  创建线程实例

前面介绍了多线程程序设计的基本知识,本节结合实例对几种多线程程序设计进行介绍。

【示例14.1】 在对话框应用程序中创建用户界面线程。操作步骤如下所述。

(1)创建一个基于对话框的应用程序。

(2)选择Insert|New Class命令,弹出New Class对话框,如图14.1所示,在Name文本框中输入新建类名:CMyThread,在Base class下拉列表中选择CwinThread选项作为基类,单击"OK"按钮。

(3)为了创建一个用户界面,在资源编辑器中添加一个对话框资源,其ID为ID_ DIALOG1,利用类向导为该对话框资源添加新类:CMyDialog。

(4)在CMyThread类中添加变量CMyDialog m_dlg;,并且在其初始化函数InitInstance()中添加代码:

  1. BOOL CMyThread::InitInstance()  
  2. {  
  3.     // TODO:  perform and per-thread initialization here  
  4.     m_dlg.Create(IDD_DIALOG1);  
  5.     m_dlg.ShowWindow(SW_SHOW);              //显示对话框  
  6.     m_pMainWnd=&m_dlg;  
  7.     return TRUE;  

注意:需要在CMyThread.h文件中添加#include"MyDialog.h"语句,否则会提示错误。

 
(点击查看大图)图14.1  New Class对话框
(5)在ExitInstance()函数中添加撤销窗口代码:
  1. int CMyThread::ExitInstance()  
  2. {  
  3.     // TODO:  perform any per-thread cleanup here  
  4.     m_dlg.DestroyWindow();                      //销毁窗口  
  5.     return CWinThread::ExitInstance();  

(6)在主对话框中添加一个按钮控件,其ID为IDC_SHOW,标题为"用户界面线程",添加单击的消息映射,编写函数。

  1. void CTestDlg::OnShow()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CMyThread));  
  5.                                                             //启动用户界面线程  

注意:需要在CTestDlg.cpp文件中添加#include "MyThread.h"语句,否则会提示错误。

上面的代码就是启动一个用户界面线程。

(7)利用类向导添加单击的消息映射,编写函数体如下:

  1. void CMyDialog::OnLButtonDown(UINT nFlags, CPoint point)   
  2. {  
  3.     AfxMessageBox("You Clicked The Left Button!");  //弹出消息框  
  4.     CDialog::OnLButtonDown(nFlags, point);  

(8)编译、连接,运行后单击"用户界面线程"按钮,结果如图14.2所示。

 
(点击查看大图)图14.2  运行结果

上面介绍了创建用户界面线程的基本方法。对于一个用户界面线程,因为该线程拥有窗口。所以可以处理消息,而工作者线程,除非自己加入消息处理机制,否则不会处理消息。下面介绍工作者线程的创建办法。

【示例14.2】 在对话框应用程序中创建工作者线程。具体的操作步骤如下:

(1)创建一个基于对话框的应用程序。

(2)在对话框上面添加一个按钮控件,其ID为ID_START,标题为"开始工作者线程",再添加一个进度条控件,并且利用类向导添加一个变量:CprogressCtrl m_progress;。

(3)在TestDlg.cpp中添加结构体如下:

  1. struct threadInfo  
  2. {  
  3.     int i;  
  4.     CProgressCtrl* pctrlProgress;           //进度条对象指针  
  5. }Info; 

上面的结构体中,变量i为进度条的速度,pctrlProgress为进度条的指针。

(4)编写一个函数fun(),利用该函数实现进度条的步进。具体代码如下:

  1. UINT  fun(LPVOID p)  
  2. {    threadInfo* pInfo=(threadInfo*)p;      //线程函数的参数  
  3.     for(int i=0;i<100;i++)  
  4.     {  
  5.         int nTemp=pInfo->i;  
  6.         pInfo->pctrlProgress->SetPos(i);    //设置进度条步进  
  7.         Sleep(nTemp);  
  8.     }  
  9.     return 0;  

上面的代码是利用参数设置进度条的进度。

(5)添加单击"开始工作者线程"按钮的消息映射,编写函数体,创建工作者线程进入上面的函数,代码如下:

  1. void CTestDlg::OnStart()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     Info.i=9;  
  5.     Info.pctrlProgress=&m_progress;  
  6.     pThread=AfxBeginThread(fun,&Info);  //其他线程  

上面的代码必须在fun()函数的后面,否则提示fun()函数没有定义,或者在该函数前添加fun函数的声明语句。

(6)编译、连接,运行结果如图14.3所示。

本节介绍了线程创建的基本方法。同时介绍了工作者线程和用户界面线程创建的区别。在下一节中给出线程通信和线程同步的应用实例。

 
(点击查看大图)图14.3  运行结果

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇解读Visual C++ 2005具体实例 下一篇14.4 线程同步

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: