




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验九 多线程程序设计一、实验目的1、工作线程的创建;2、多线程的创建;3、主程序与线程间数据交换;4、线程工作状态设置及修改。二、实验要求2.1 创建一个窗口,建立子菜单(创建线程(BEGIN_THREAD)、线程关闭(CLOSE),利用创建线程BEGIN_THREAD,创建许多工作线程,利用线程关闭(CLOSE)所有线程。每个工作线程都对全局变量int gl_i加100,然后在线程中判别全局变量BOOL gl_bclose,当判别为线程结束时,将当前线程获得的gl_i在对话中显示(即中间对话中显示的值)。注意,由于线程是一个简单的延时后累加的过程,所有随着控制线程是否结束的时间不同,得到的值是不相同的。控制线程结束,利用线程关闭(CLOSE)实现对gl_bclose的修改。2.2 同1,要求利用子菜单选择同时启动两个线程,在这两个线程中分别有各自的累加值并在线程中对其进行累加,不过要求两个线程有不同的优先级别,当线程关闭后,显示两线程当前的累计值。2.3 编写一个线程,功能是将主程序通过利用参数传递方法传递给线程的一个整型数(或一个类)定时累加。建立一个对话窗口,有线程的启动、挂起/运行和停止三个按钮,启动按钮实现启动一个线程,挂起/运行是一个按钮,是根据当前线程的状态设置,显然当线程在运行状况,该按钮应该显示挂起,反之,显示运行,当按该按钮后,使线程处于挂起状态或运行状态,停止按钮显然是停止该线程的运行。另有一个MOVE按钮和一个编辑控件,按MOVE按钮将当前线程中的整型值在编辑控件上显示。目的:了解线程与主程序间的参数传递。三、实验过程3.1 首先创建单文档工程,如下图:3.2 第一部分 线程的创建与结束:3.2.1 添加全局变量: int gl_i; /计数 BOOL gl_bclose; /线程控制:true结束所有线程;false线程继续执行3.2.2 线程的创建:线程靠一个CWinThread类的对象来管理,启动一个新线程的方法很简单,用到API函数的AfxBeginThread,定义如下: CWinThread * AFXAPI AfxBeginThread (AFX_THREADPROC pfnThreadProc, / 线程函数的地址LPVOID pParam, /传送到线程函数的参数int nPriority , / (可选的)线程的优先级,默认的是平常的优先级,UINT nStackSize, / (可选的)线程的堆栈大小DWORD dwCreateFlags, / (可选的)如果用户创建的线程在开始的时候在挂起态,而不在运行态,可以设置为 CREATE_SUSPENDEDLPSECURITY_ATTRIBUTES lpSecurityAttrs/ (可选的)线程的安全属性,默认的是和父线程的访问权限一样 ); 函数 AfxBeginThread 启动新线程并返回一个线程对象指针,然后,新线程和启动新线程的线程同时运行。函数的第一个参数指定线程函数。新线程首先执行这个函数,在这个函数中可以再调用其他函数完成新线程的工作,这个函数执行完毕返回时,新线程结束。线程函数不能是任意定义,必须定义如下: UINT ThreadFunction(LPVOID pParam); 这个函数必须被定义成全局函数,函数的返回类型必须是UINT,必须有一个 LPVOID 类型的参数,这个参数一般使用 AfxBeginThread 函数的第二个参数 pParam。函数的返回值在函数中任意定义(但不能返回特殊值 STILL_AVTIVE,它被定义成0X00000l03L,表示线程仍在运行,引起混淆)。AfxBeginThread函数的具体用法可查阅MSDN。3.2.3 线程函数:线程函数定义了线程要做什么,在进入这个函数的时候线程开始,退出的时候线程结束。这个函数称为线程函数,定义如下:UINT ThreadFunction( LPVOID pParam );这里:ThreadFunction 是线程函数名,就是启动线程函数的第一个参数 pfnThreadProc。参数 LPVOID pParam 是启动线程函数的第二个参数,该参数是一个32位数,是在线程对象创建时传送给对象的构造函数。线程函数根据需要进行对参数进行处理,实际上,线程和主程序之间可以利用这个参数实现数据传递。3.2.4 终止线程:线程终止由两种方法,一种是等待线程函数执行完毕后自动退出,线程退出后创建的线程对象是否自动删除,是由CWinThread 对象的一个成员变量 m_bAutoDelete决定,为TRUE时,线程执行后自动删除创建的CWinThread对象,否则,在线程结束后,该对象并不删除,需要外部来删除。可以在线程创建后对m_bAutoDelete 设置。如: m_pDrawThread - m_bAutoDelete = FALSE ;这样,在线程执行结束后并不删除,需要外部去删除: delete m_pDrawThread;另一个终止线程的方法是调用MFC函数 AfxEndThread:void AFXAPI AfxEndThread( UINT nExitCode, BOOL bDelete );延时计数可利用函数:VOID Sleep( DWORD dwMilliseconds / 延时长度(单位:毫秒));实验九第一部分最终结果如下图:第一部分程序如下:class Ctest9 / 定义一个类public: Ctest9() m_i = 0 ; void Set( int i ) m_i = i ;void SetId( int i ) id = i; ; int Get() return m_i ; ;int GetId() return id ; ; void Inc() m_i += 1 ;private: int m_i; /累计值int id; /线程编号 ;UINT testThread1(LPVOID pParam) /线程主函数/接收一个窗口类指针,然后设置窗口标题 HWND hWnd = (HWND)pParam; / 将传入的线程函数参数转换为窗口句柄 while(!gl_bclose) / 判别gl_bclose是否为TRUE,否则线程继续运行Sleep(1000); /1s gl_i += 100; /延时累加 char str81 ;wsprintf(str,全局变量值:%d, gl_i); AfxMessageBox( str ); / 显示 gl_i 值 return 0; / 返回并退出线程 /或者调用void AfxEndThread( UINT nExitCode );来退出void OnThreadCreate() gl_bclose = FALSE; HWND hWnd = GetSafeHwnd(); AfxBeginThread(testThread1, hWnd); / 创建工作线程3.3 第二部分 创建优先级不同的双线程:3.3.1 创建双线程:虽然是创建双线程,但其实两个线程的内部工作方式相同,只是传递的参数不同,因此只需一个线程函数即可:UINT testDoubleThread(LPVOID pParam);然后利用3.2.2中提到的AfxBeginThread()来创建线程:AfxBeginThread(testDoubleThread, pParam1, THREAD_PRIORITY_ABOVE_NORMAL);/创建第一个线程,优先级高于默认AfxBeginThread(testDoubleThread, pParam2, THREAD_PRIORITY_BELOW_NORMAL);/创建第二个线程,优先级低于默认3.3.2 终止双线程:同样可以利用3.2中的全局变量gl_bclose来控制线程的结束。最终结果如下图:第二部分程序如下:UINT testDoubleThread(LPVOID pParam) /线程主函数Ctest9* pCtest9;pCtest9 = (Ctest9*)pParam;while (!gl_bclose)Sleep(500);pCtest9-Inc();char str81;wsprintf(str, 线程%d累计值:%d, pCtest9-GetId(),pCtest9-Get();AfxMessageBox(str);if( pCtest9 != NULL) delete pCtest9 ;return 0;void CMainFrame:OnDoublethreadCreate() gl_bclose = FALSE;Ctest9* pCtest9_1;pCtest9_1 = new Ctest9;pCtest9_1-SetId(1);LPVOID pParam1 = (LPVOID)pCtest9_1;AfxBeginThread(testDoubleThread, pParam1, THREAD_PRIORITY_ABOVE_NORMAL);/创建第一个线程,优先级高于默认Ctest9* pCtest9_2;pCtest9_2 = new Ctest9;pCtest9_2-SetId(2);LPVOID pParam2 = (LPVOID)pCtest9_2;AfxBeginThread(testDoubleThread, pParam2, THREAD_PRIORITY_BELOW_NORMAL);/创建第二个线程,优先级低于默认3.4 第三部分 线程的控制:3.4.1 插入对话框,如下图:3.4.1 为工程添加变量:为3个EditBox分别添加成员变量: int m_Value1; /计数初始值 int m_Value2; /计数增量 int m_Value3; /计数结果四个按钮分别用来创建线程,暂停/运行,终止线程,显示最终结果。按钮的状态可由下面两个函数控制:CButton:EnableWindow(BOOL bEnable); /TRUE可用;FALSE不可用(变灰)CButton:SetWindowText( LPCTSTR pszString); /实现将按钮上的字符改变添加全局变量: bool pause_flag = FALSE; /线程结束标志bool end_flag = FALSE; /线程挂起标志int gl_last = 0; /全局变量,存放累加值最终结果如下图:图1:创建线程图2:线程挂起图3:线程结束并显示结果第三部分程序如下:bool pause_flag = FALSE; /线程结束标志bool end_flag = FALSE; /线程挂起标志int gl_last = 0; /全局变量,存放累加值class CTest9_3public:CTest9_3() m_InitValue = m_Step = 0;void Inc() m_InitValue += m_Step;int GetValue() return m_InitValue;void SetValue(int v1,int v2) m_InitValue = v1;m_Step = v2;protected:private:int m_InitValue;int m_Step; /主程序与线程传递的参数UINT testThread3(LPVOID pParam) CTest9_3* lpc = (CTest9_3*)pParam; while (!end_flag) /线程是否结束? while (pause_flag) /线程是否挂起? Sleep(50); /线程休眠Sleep(1000);lpc-Inc(); /延时累加,1s gl_last = lpc-GetValue(); /线程结束,保存累加值 if( lpc != NULL) delete lpc ;return 0;void OnThreadBegin() end_flag = FALSE;pause_flag = FALSE;gl_last = 0; /初始化UpdateData(TRUE); /获取输入的初始值以及步长值CTest9_3* lpc;lpc = new CTest9_3;lpc-SetValue(m_InitValue, m_Step);LPVOID pParam = (LPVOID)lpc; /定义线程操作的数据 CButton* button=(CButton*)GetDlgItem(IDC_THREAD_BEGIN); button-EnableWindow(FALSE); /“启动”按钮失效(变灰)AfxBeginThread(testThread3,pParam);/启动线程void OnThreadRunpause() CButton* button=(CButton*)GetDlgItem(IDC_THREAD_RUNPAUSE); if (!pause_flag) pause_flag = TRUE;button-SetWindowText(运行); /线程运行时显示“挂起” else pause_flag = FALSE;button-SetWindowText(挂起); /线程挂起
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国外美术考试试题及答案
- 2024长春市九台区其塔木镇社区工作者招聘考试试题
- 福建省莆田市2026届化学高一上期末预测试题含解析
- 2026届湖南省长沙市重点中学化学高三第一学期期中调研模拟试题含解析
- 2024重庆市渝北区鸳鸯街道社区工作者招聘考试试题
- 广东省肇庆市百花中学2026届化学高一第一学期期末统考模拟试题含解析
- 细胞治疗产品临床试验与审批流程法规解读报告
- 2025年实验动物上岗证(动物实验类)考试题库(附答案)
- 2025年国家开放大学专科《公共行政学》期末考试试题及答案
- 电大本科行政管理课程期末试题及答案
- 广西桂林旅游文化宣传城市介绍文旅科普美食
- 学校栏杆工程施工方案
- 2025年高考语文备考之名著阅读《红楼梦》与《乡土中国》衔接融合习题含答案
- 2024年锅炉操作工(技师)职业鉴定理论考试题库(含答案)
- 人力资源许可证制度(服务流程、服务协议、收费标准、信息发布审查和投诉处理)
- 外研版(2024)七年级上册英语Starter教学设计
- 2024至2030年中国山西省轨道交通行业市场深度研究及投资战略规划报告
- 高考高中数学必考23个经典不等式总结
- 地质调查员三级(区域地质、矿产地质、矿山地质)复习参考试题库(含答案)
- 《义务教育语文课程标准》(2022年版)原文
- 《建筑防排烟工程》 课件 1火灾烟气的产生及危害
评论
0/150
提交评论