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()中添加代码:
- BOOL CMyThread::InitInstance()
- {
-
- m_dlg.Create(IDD_DIALOG1);
- m_dlg.ShowWindow(SW_SHOW);
- m_pMainWnd=&m_dlg;
- return TRUE;
- }
注意:需要在CMyThread.h文件中添加#include"MyDialog.h"语句,否则会提示错误。
|
| (点击查看大图)图14.1 New Class对话框 |
(5)在ExitInstance()函数中添加撤销窗口代码:
- int CMyThread::ExitInstance()
- {
-
- m_dlg.DestroyWindow();
- return CWinThread::ExitInstance();
- }
(6)在主对话框中添加一个按钮控件,其ID为IDC_SHOW,标题为"用户界面线程",添加单击的消息映射,编写函数。
- void CTestDlg::OnShow()
- {
-
- CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CMyThread));
-
- }
注意:需要在CTestDlg.cpp文件中添加#include "MyThread.h"语句,否则会提示错误。
上面的代码就是启动一个用户界面线程。
(7)利用类向导添加单击的消息映射,编写函数体如下:
- void CMyDialog::OnLButtonDown(UINT nFlags, CPoint point)
- {
- AfxMessageBox("You Clicked The Left Button!");
- CDialog::OnLButtonDown(nFlags, point);
- }
(8)编译、连接,运行后单击"用户界面线程"按钮,结果如图14.2所示。
|
| (点击查看大图)图14.2 运行结果 |
上面介绍了创建用户界面线程的基本方法。对于一个用户界面线程,因为该线程拥有窗口。所以可以处理消息,而工作者线程,除非自己加入消息处理机制,否则不会处理消息。下面介绍工作者线程的创建办法。
【示例14.2】 在对话框应用程序中创建工作者线程。具体的操作步骤如下:
(1)创建一个基于对话框的应用程序。
(2)在对话框上面添加一个按钮控件,其ID为ID_START,标题为"开始工作者线程",再添加一个进度条控件,并且利用类向导添加一个变量:CprogressCtrl m_progress;。
(3)在TestDlg.cpp中添加结构体如下:
- struct threadInfo
- {
- int i;
- CProgressCtrl* pctrlProgress;
- }Info;
上面的结构体中,变量i为进度条的速度,pctrlProgress为进度条的指针。
(4)编写一个函数fun(),利用该函数实现进度条的步进。具体代码如下:
- UINT fun(LPVOID p)
- { threadInfo* pInfo=(threadInfo*)p;
- for(int i=0;i<100;i++)
- {
- int nTemp=pInfo->i;
- pInfo->pctrlProgress->SetPos(i);
- Sleep(nTemp);
- }
- return 0;
- }
上面的代码是利用参数设置进度条的进度。
(5)添加单击"开始工作者线程"按钮的消息映射,编写函数体,创建工作者线程进入上面的函数,代码如下:
- void CTestDlg::OnStart()
- {
-
- Info.i=9;
- Info.pctrlProgress=&m_progress;
- pThread=AfxBeginThread(fun,&Info);
- }
上面的代码必须在fun()函数的后面,否则提示fun()函数没有定义,或者在该函数前添加fun函数的声明语句。
(6)编译、连接,运行结果如图14.3所示。
本节介绍了线程创建的基本方法。同时介绍了工作者线程和用户界面线程创建的区别。在下一节中给出线程通信和线程同步的应用实例。
|
| (点击查看大图)图14.3 运行结果 |
【责任编辑:
云霞 TEL:(010)68476606】