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中添加变量作为全局变量:
- CSemaphore semaphoreWrite(3,3);
- char g_Array[10];
semaphoreWrite是类CSemaphore的对象,在线程同步曾介绍过此类,当需要一个计数器来限制可以使用某个线程的数目时,使用了信号量对象,并且初始化为3个。g_Array[10]是保存输出的字符序列。
(5)在TestDlg.cpp中添加三个函数,实现代码输出。
- UINT WriteA(LPVOID pParam)
- {
- CEdit *pEdit=(CEdit*)pParam;
- pEdit->SetWindowText("");
- WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
- CString str;
- for(int i=0;i<10;i++)
- {
- pEdit->GetWindowText(str);
- g_Array[i]='A';
- str=str+g_Array[i];
- pEdit->SetWindowText(str);
- Sleep(1000);
- }
- ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
- return 0;
-
- }
- UINT WriteB(LPVOID pParam)
- {
- CEdit *pEdit=(CEdit*)pParam;
- pEdit->SetWindowText("");
- WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
- CString str;
- for(int i=0;i<10;i++)
- {
-
- pEdit->GetWindowText(str);
- g_Array[i]='B';
- str=str+g_Array[i];
- pEdit->SetWindowText(str);
- Sleep(1000);
- }
- ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
- return 0;
-
- }
- UINT WriteC(LPVOID pParam)
- {
- CEdit *pEdit=(CEdit*)pParam;
- pEdit->SetWindowText("");
- WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
- CString str;
- for(int i=0;i<10;i++)
- {
- pEdit->GetWindowText(str);
- g_Array[i]='C';
- str=str+g_Array[i];
- pEdit->SetWindowText(str);
- Sleep(1000);;
- }
- ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
- return 0;
-
- }
(6)添加单击"显示"按钮的消息映射,实现创建线程,进行输出,具体如下:
- void CTestDlg::OnShow()
- {
-
- CWinThread *pWriteA=AfxBeginThread(WriteA,
- &m_A,
- THREAD_PRIORITY_NORMAL,
- 0,
- CREATE_SUSPENDED);
- pWriteA->ResumeThread();
-
- CWinThread *pWriteB=AfxBeginThread(WriteB,
- &m_B,
- THREAD_PRIORITY_NORMAL,
- 0,
- CREATE_SUSPENDED);
- pWriteB->ResumeThread();
-
- CWinThread *pWriteC=AfxBeginThread(WriteC,
- &m_C,
- THREAD_PRIORITY_NORMAL,
- 0,
- CREATE_SUSPENDED);
- pWriteC->ResumeThread();
-
- }
上面的代码是利用AfxBeginThread()函数创建多个线程,实现输出,并且要ResumeThread终止线程。
注意:需要包含头文件#include "afxmt.h",将CSemaphore类添加进来,否则会提示错误。同时上面的函数需放在步骤(5)中函数的下面,否则提示函数没有定义,或者首先声明步骤(5)中的三个函数。
【责任编辑:
云霞 TEL:(010)68476606】