《线程的编程实现(操作系统)》由会员分享,可在线阅读,更多相关《线程的编程实现(操作系统)(42页珍藏版)》请在金锄头文库上搜索。
1、第9章 多线程 返回目录内容摘要:n创建线程 n实现线程间通信 n利用线程同步技术保障数据安全9.1 创建线程 学习目标调用AfxBeginThread()来启动线程。 9.19.1返回第9章程序的实现步骤利用AppWizard生成程序框架(ThreadTest )编辑资源 添加菜单响应函数 编写线程函数 在视中输出信息9.19.1步骤1 生成程序框架(MenuTest)项目名称: ThreadTest 选择单文档界面应用程序(Single document)9.19.1步骤2 编辑资源1.编辑菜单资源 线程 Pop-up 选中 Caption ID启动线程 ID_THREAD_START其他
2、任务 ID_TREEAD_OTHER 2.编辑对话框资源 9.19.1IDD_DIALOG_THRAED CDlgThread 步骤3 添加菜单响应函数 Class Name Objects IDs MessagesCThreadTestView ID_THREAD_START COMMANDCThreadTestView ID_TREEAD_OTHER COMMAND9.19.1void void CThreadTestView:OnThreadStartCThreadTestView:OnThreadStart() () HWND HWND hWndhWnd = = GetSafeHwnd
3、GetSafeHwnd();();AfxBeginThread(TreadProcAfxBeginThread(TreadProc, , hWndhWnd, THREAD_PRIORITY_NORMAL);, THREAD_PRIORITY_NORMAL); void void CThreadTestView:OnThraedOtherCThreadTestView:OnThraedOther() () CDlgThreadCDlgThread dlgdlg; ;dlg.DoModaldlg.DoModal();(); 步骤4 编写线程函数 1. 在视类中添加两个成员变量。并在构造函数中初始化
4、9.19.1class CThreadTestView : public CViewpublic:CString m_strMessage;int m_iTime; CThreadTestView:CThreadTestView()m_strMessage = “没有线程启动“;m_iTime = 0; 步骤5 在视中输出信息9.19.1void CThreadTestView:OnDraw(CDC* pDC)CThreadTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data
5、 herechar chNumber6;itoa(m_iTime, chNumber, 10);pDC-TextOut(30,30, m_strMessage);pDC-TextOut(30,50,chNumber);2. 线程函数9.19.1 UINT TreadProc(LPVOID param)CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp();CMainFrame *pMainFrame = (CMainFrame *)pApp-GetMainWnd();CThreadTestView *pView = (CThreadTestVie
6、w *) pMainFrame-GetActiveView();pView-m_strMessage = “启动了一个线程!“;while(pView-m_iTime m_iTime +;pView-Invalidate();pView-m_iTime =0;pView-m_strMessage = “线程结束!“;return 0;基本知识CWnd类的GetSafeHwnd();返回窗口 句柄AfxBeginThread();线程函数 ( 返回UINT) CMainFrame:GetActiveView();:Sleep(1000);9.19.19.2 线程间通信 学习目标 1. 使用全局变
7、量实现线程间通信 2.使用消息实现线程间通信 3.使用CEvent类实现线程间通信 9.29.2返回第9章1. 使用全局变量实现线程间通信在上一节程序的基础上,进行以下操作: (1)在“线程”菜单中添加菜单项: “终止线程”,ID_THREAD_STOP。 (2)在ThreadTestView.cpp文件中添加一个全局变量 threadController,用来控制线程是否继续。添加方法是在 ThreadTestView.cpp的最上面,在endif下面添加下面的语句:volatile int threadController; (3)在视类中为“停止线程”添加消息处理函数OnThreadSt
8、op ()。9.29.2void CThreadTestView:OnThreadStop() threadController = 0;1. 使用全局变量实现线程间通信4修改OnThreadStart ()函数,代码如下所示:9.29.2void CThreadView:OnStartthread() threadController = 1;HWND hWnd = GetSafeHwnd();AfxBeginThread(TreadProc, hWnd, THREAD_PRIORITY_NORMAL);5修改ThreadProc()函数的代码,代码如下:9.29.2 UINT TreadP
9、roc(LPVOID param)CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp();CMainFrame *pMainFrame = (CMainFrame *)pApp-GetMainWnd();CThreadTestView *pView = (CThreadTestView *) pMainFrame-GetActiveView();pView-m_strMessage = “启动了一个线程!“;while(threadController):Sleep(1000);pView-m_iTime +;pView-Invalidate()
10、;pView-m_iTime =0;pView-m_strMessage = “线程结束!“;return 0; 2.使用消息实现线程间通信(1)在ThreadTestView.h文件中定义消息:const WM_THREAD_SENDMESS = WM_USER + 20; (2)在ThreadTestView.h文件中添加消息函数声明:afx_msg int OnThreadSendmess(); (3)在ThreadTestView.cpp文件中添加消息映射:ON_MESSAGE(WM_THREAD_SENDMESS, OnThreadSendmess) (4)OnThreadSendm
11、ess()代码如下:9.29.2int CThreadTestView:OnThreadSendmess()m_iTime +;Invalidate();return 0;2.使用消息实现线程间通信(5)修改ThreadProc()函数如下 :9.29.2UINT TreadProc(LPVOID param)CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp();CMainFrame *pMainFrame = (CMainFrame *)pApp-GetMainWnd();CThreadTestView *pView = (CThreadTe
12、stView *) pMainFrame-GetActiveView();pView-m_strMessage = “启动了一个线程!“;while(threadController):Sleep(1000);:PostMessage(HWND)param, WM_THREAD_SENDMESS, 0, 0);pView-m_iTime =0;pView-m_strMessage = “线程结束!“;return 0;基本知识PostMessage(HWND)param, WM_THREAD_SENDMESS, 0, 0);4.54.53.使用CEvent类实现线程间通信 (1)Event对象
13、:有两种状态:通信状态和非通信状态 (2)创建一个CEvent类的对象很:CEvent threadStart;他自动的处在未通信状态 (3)threadStart.SetEvent(); 使其处于通信状态 (4)调用WaitForSingleObject()来监视CEvent对象 的: :WaitForSingleObject(threadStart.m_hObject, INFINITE);9.29.23.使用CEvent类实现线程间通信 在上一节程序的基础上,进行以下操作: (1)在ThreadTestView.cpp中:#include “afxmt.h“ (2)在ThreadTest
14、View.cpp中加上下列两个全局变量: CEvent threadStart; CEvent threadEnd; (3)修改ThreadProc()函数 (4)修改OnThreadStart ()函数中的内容。 (5)修改OnThreadStop ()函数中的内容。 (6)CThreadTestView添加WM_CREATE消息处理函数OnCreate ()。 9.29.2void CThreadTestView:OnThreadStart() threadStart.SetEvent();void CThreadTestView:OnThreadStop() threadEnd.SetE
15、vent();3.使用CEvent类实现线程间通信 9.29.2UINT TreadProc(LPVOID param)CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp();CMainFrame *pMainFrame = (CMainFrame *)pApp-GetMainWnd();CThreadTestView *pView = (CThreadTestView *) pMainFrame-GetActiveView();:WaitForSingleObject(threadStart.m_hObject, INFINITE);pView
16、-m_strMessage = “启动了一个线程!“;BOOL keepRunning = TRUE;while (keepRunning):Sleep(1000);int result = :WaitForSingleObject(threadEnd.m_hObject, 0);if (result = WAIT_OBJECT_0)keepRunning = FALSE;:PostMessage(HWND)param, WM_THREAD_SENDMESS, 0, 0);pView-m_iTime =0;pView-m_strMessage = “线程结束!“;return 0;3.使用CEv