设为首页 加入收藏

TOP

14.6 本章实例--多线程
2013-10-07 01:17:57 来源: 作者: 【 】 浏览:70
Tags:14.6 本章 实例 线程

14.6  本章实例--多线程

前面一节介绍了创建用户界面线程和创建工作者线程的具体实例,本节结合线程的同步和线程的通信给出综合实例。

【示例14.3】 利用多线程技术编写程序,在对话框应用程序中的三个编辑框中同时同步地输出A、B、C三个字母,输出10个。具体操作步骤如下:

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

(2)在对话框上添加三个编辑框控件,其ID分别为IDC_EDIT1、IDC_EDIT2和IDC_EDIT1。再添加一个按钮控件,其ID为ID_SHOW,标题为"显示"。

(3)利用类向导为三个编辑框添加变量,分别为:Cedit m_A;、Cedit m_B;、Cedit m_A;。

(4)在TestDlg.cpp中添加变量作为全局变量:

  1. CSemaphore semaphoreWrite(3,3);         //信号量对象  
  2. char g_Array[10];                       //字符数组 

semaphoreWrite是类CSemaphore的对象,在线程同步曾介绍过此类,当需要一个计数器来限制可以使用某个线程的数目时,使用了信号量对象,并且初始化为3个。g_Array[10]是保存输出的字符序列。

(5)在TestDlg.cpp中添加三个函数,实现代码输出。

  1. UINT WriteA(LPVOID pParam)                              //线程函数  
  2. {  
  3.     CEdit *pEdit=(CEdit*)pParam;  
  4.     pEdit->SetWindowText("");  
  5.     WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE); //等待信号量  
  6.     CString str;  
  7.     for(int i=0;i<10;i++)                               //逐个输出字母A  
  8.     {  
  9.         pEdit->GetWindowText(str);  
  10.         g_Array[i]='A';  
  11.         str=str+g_Array[i];  
  12.         pEdit->SetWindowText(str);                      //在编辑框中输出字符  
  13.         Sleep(1000);  
  14.     }  
  15.     ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);  //释放信号量  
  16.     return 0;  
  17.  
  18. }  
  19. UINT WriteB(LPVOID pParam)  
  20. {  
  21.     CEdit *pEdit=(CEdit*)pParam;  
  22.     pEdit->SetWindowText("");  
  23.     WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);  
  24.     CString str;  
  25.     for(int i=0;i<10;i++)  
  26.     {  
  27.  
  28.         pEdit->GetWindowText(str);  
  29.         g_Array[i]='B';  
  30.         str=str+g_Array[i];  
  31.         pEdit->SetWindowText(str);  
  32.         Sleep(1000);  
  33.     }  
  34.     ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);  
  35.     return 0;  
  36.  
  37. }  
  38. UINT WriteC(LPVOID pParam)  
  39. {  
  40.     CEdit *pEdit=(CEdit*)pParam;  
  41.     pEdit->SetWindowText("");  
  42.     WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);  
  43.     CString str;  
  44.     for(int i=0;i<10;i++)  
  45.     {  
  46.         pEdit->GetWindowText(str);  
  47.         g_Array[i]='C';  
  48.         str=str+g_Array[i];  
  49.         pEdit->SetWindowText(str);  
  50.         Sleep(1000);;  
  51.     }  
  52.     ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);  
  53.     return 0;  
  54.  

(6)添加单击"显示"按钮的消息映射,实现创建线程,进行输出,具体如下:

  1. void CTestDlg::OnShow()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.         CWinThread *pWriteA=AfxBeginThread(WriteA,      //线程1  
  5.         &m_A,  
  6.         THREAD_PRIORITY_NORMAL,  
  7.         0,  
  8.         CREATE_SUSPENDED);  
  9.     pWriteA->ResumeThread();  
  10.  
  11.     CWinThread *pWriteB=AfxBeginThread(WriteB,          //线程2  
  12.         &m_B,  
  13.         THREAD_PRIORITY_NORMAL,  
  14.         0,  
  15.         CREATE_SUSPENDED);  
  16.     pWriteB->ResumeThread();  
  17.  
  18.     CWinThread *pWriteC=AfxBeginThread(WriteC,           //线程3  
  19.         &m_C,  
  20.         THREAD_PRIORITY_NORMAL,  
  21.         0,  
  22.         CREATE_SUSPENDED);  
  23.     pWriteC->ResumeThread();  
  24.  

上面的代码是利用AfxBeginThread()函数创建多个线程,实现输出,并且要ResumeThread终止线程。

注意:需要包含头文件#include "afxmt.h",将CSemaphore类添加进来,否则会提示错误。同时上面的函数需放在步骤(5)中函数的下面,否则提示函数没有定义,或者首先声明步骤(5)中的三个函数。

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

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇14.8 常见问题及解答 下一篇14.3.3 线程间通信

评论

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