线程的编程实现(操作系统)

上传人:宝路 文档编号:48241962 上传时间:2018-07-12 格式:PPT 页数:42 大小:132.93KB
返回 下载 相关 举报
线程的编程实现(操作系统)_第1页
第1页 / 共42页
线程的编程实现(操作系统)_第2页
第2页 / 共42页
线程的编程实现(操作系统)_第3页
第3页 / 共42页
线程的编程实现(操作系统)_第4页
第4页 / 共42页
线程的编程实现(操作系统)_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《线程的编程实现(操作系统)》由会员分享,可在线阅读,更多相关《线程的编程实现(操作系统)(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

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号