《vc多线程》ppt课件_第1页
《vc多线程》ppt课件_第2页
《vc多线程》ppt课件_第3页
《vc多线程》ppt课件_第4页
《vc多线程》ppt课件_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9章 多线程 内容摘要: 创立线程 实现线程间通信 利用线程同步技术保障数据平安 返回目录9.1 9.1 创立线程 学习目的调用AfxBeginThread来启动线程。 返回第9章程序的实现步骤利用AppWizard生成程序框架ThreadTest 编辑资源 添加菜单响应函数 编写线程函数 在视中输出信息步骤1 生成程序框架MenuTest工程名称: ThreadTest 选择单文档界面应用程序Single document步骤2 编辑资源1.编辑菜单资源 线程 Pop-up 选中 Caption ID 启动线程 ID_THREAD_START 其他任务 ID_TREEAD_OTHER2.编

2、辑对话框资源 IDD_DIALOG_THRAED CDlgThread 步骤3 添加菜单响应函数 Class Name Objects IDs MessagesCThreadTestView ID_THREAD_START COMMAND1.CThreadTestView ID_TREEAD_OTHER COMMAND步骤4 编写线程函数 1. 在视类中添加两个成员变量。并在构造函数中初始化class CThreadTestView : public CView public:CString m_strMessage;int m_iTime; CThreadTestView:CThreadTe

3、stViewm_strMessage = 没有线程启动;m_iTime = 0; 步骤5 在视中输出信息void CThreadTestView:OnDrawCDC* pDCCThreadTestDoc* pDoc = GetDocument;ASSERT_VALIDpDoc;/ TODO: add draw code for native data here char chNumber6;itoam_iTime, chNumber, 10;pDC-TextOut30,30, m_strMessage;pDC-TextOut30,50,chNumber;2. 线程函数UINT TreadPro

4、cLPVOID paramCThreadTestApp *pApp=CThreadTestApp * AfxGetApp; CMainFrame *pMainFrame = CMainFrame *pApp-GetMainWnd; CThreadTestView *pView = CThreadTestView * pMainFrame-GetActiveView;pView-m_strMessage = 启动了一个线程!启动了一个线程!;whilepView-m_iTime m_iTime +;pView-Invalidate;pView-m_iTime =0;pView-m_strMess

5、age = 线程完毕!线程完毕!;return 0;根本知识CWnd类的GetSafeHwnd;返回窗口句柄AfxBeginThread;线程函数 返回UINT CMainFrame:GetActiveView;:Sleep1000;9.2 线程间通信 学习目的1. 使用全局变量实现线程间通信 2.使用消息实现线程间通信3.使用CEvent类实现线程间通信 返回第9章1. 使用全局变量实现线程间通信在上一节程序的根底上,进展以下操作:1在“线程菜单中添加菜单项: “终止线程,ID_THREAD_STOP。2在ThreadTestView.cpp文件中添加一个全局变量threadControll

6、er,用来控制线程是否继续。添加方法是在ThreadTestView.cpp的最上面,在endif下面添加下面的语句:volatile int threadController;3在视类中为“停顿线程添加消息处理函数OnThreadStop 。void CThreadTestView:OnThreadStop threadController = 0;1. 使用全局变量实现线程间通信4修改OnThreadStart 函数,代码如下所示:void CThreadView:OnStartthread threadController = 1;HWND hWnd = GetSafeHwnd;AfxB

7、eginThreadTreadProc, hWnd, THREAD_PRIORITY_NORMAL;5修改ThreadProc函数的代码,代码如下:UINT TreadProcLPVOID paramCThreadTestApp *pApp=CThreadTestApp * AfxGetApp; CMainFrame *pMainFrame = CMainFrame *pApp-GetMainWnd; CThreadTestView *pView = CThreadTestView * pMainFrame-GetActiveView;pView-m_strMessage = 启动了一个线程!

8、;whilethreadController:Sleep1000;pView-m_iTime +;pView-Invalidate;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_MESSAGEW

9、M_THREAD_SENDMESS, OnThreadSendmess4OnThreadSendmess代码如下:int CThreadTestView:OnThreadSendmessm_iTime +;Invalidate; return 0;2.使用消息实现线程间通信5修改ThreadProc函数如下 :UINT TreadProcLPVOID paramCThreadTestApp *pApp=CThreadTestApp * AfxGetApp; CMainFrame *pMainFrame = CMainFrame *pApp-GetMainWnd; CThreadTestView

10、 *pView = CThreadTestView * pMainFrame-GetActiveView;pView-m_strMessage = 启动了一个线程!;whilethreadController:Sleep1000;:PostMessageHWNDparam, WM_THREAD_SENDMESS, 0, 0;pView-m_iTime =0;pView-m_strMessage = 线程完毕!;return 0;根本知识PostMessageHWNDparam, WM_THREAD_SENDMESS, 0, 0;3.使用CEvent类实现线程间通信 1Event对象:有两种状态

11、:通信状态和非通信状态2创立一个CEvent类的对象很:CEvent threadStart; 他自动的处在未通信状态3threadStart.SetEvent; 使其处于通信状态 4调用WaitForSingleObject来监视CEvent对象的::WaitForSingleObjectthreadStart.m_hObject, INFINITE; 3.使用CEvent类实现线程间通信 在上一节程序的根底上,进展以下操作: 1在ThreadTestView.cpp中:#include afxmt.h2在ThreadTestView.cpp中加上以下两个全局变量:CEvent thread

12、Start;CEvent threadEnd;3修改ThreadProc函数4修改OnThreadStart 函数中的内容。 5修改OnThreadStop 函数中的内容。 6CThreadTestView添加WM_CREATE消息处理函数OnCreate。 void CThreadTestView:OnThreadStart threadStart.SetEvent;void CThreadTestView:OnThreadStop threadEnd.SetEvent;3.使用CEvent类实现线程间通信 UINT TreadProcLPVOID paramCThreadTestApp *

13、pApp=CThreadTestApp * AfxGetApp; CMainFrame *pMainFrame = CMainFrame *pApp-GetMainWnd; CThreadTestView *pView = CThreadTestView * pMainFrame-GetActiveView; :WaitForSingleObjectthreadStart.m_hObject, INFINITE;pView-m_strMessage = 启动了一个线程!;BOOL keepRunning = TRUE;while keepRunning:Sleep1000;int result

14、 = :WaitForSingleObjectthreadEnd.m_hObject, 0;if result = WAIT_OBJECT_0keepRunning = FALSE;:PostMessageHWNDparam, WM_THREAD_SENDMESS, 0, 0;pView-m_iTime =0;pView-m_strMessage = 线程完毕!;return 0;3.使用CEvent类实现线程间通信 int CThreadTestView:OnCreateLPCREATESTRUCT lpCreateStruct if CView:OnCreatelpCreateStruct

15、 = -1return -1;/ TODO: Add your specialized creation code hereHWND hWnd = GetSafeHwnd;AfxBeginThreadTreadProc, hWnd, THREAD_PRIORITY_NORMAL;return 0;9.3 线程同步 学习目的1. 使用Critical Section实现线程同步 2. 使用互斥对象mutex实现线程同步 3. 使用信号量semaphore实现线程同步 返回第9章9.3.1 使用Critical Section 1. CCriticalSection criticalSection

16、;2. criticalSection.Lock; /访问前3. criticalSection.Unlock; /访问后9.3.1 使用Critical Section 一个使用Critical Section 的线程平安类。 #include afxmt.hclass CIntArrayprivate:int array10;CCriticalSection criticalSection;public:CIntArray;CIntArray ;void SetArrayint value;void GetArrayint dstArray10;9.3.1 使用Critical Secti

17、on 一个使用Critical Section 的线程平安类。 #include stdafx.h#include IntArray.hCIntArray:CIntArray CIntArray:CIntArray void CIntArray:SetArrayint valuecriticalSection.Lock;for int x=0; x10; +xarrayx = value;criticalSection.Unlock; void CIntArray:GetArrayint dstArray10criticalSection.Lock;for int x=0; xGetMainW

18、nd; CThreadTestView *pView = CThreadTestView * pMainFrame-GetActiveView;forint i=1; iInvalidate;:Sleep2000;return 0;9.3.1 使用Critical Section UINT ReadThreadProcLPVOID paramCThreadTestApp *pApp=CThreadTestApp * AfxGetApp;CMainFrame *pMainFrame = CMainFrame *pApp-GetMainWnd;CThreadTestView *pView = CT

19、hreadTestView * pMainFrame-GetActiveView;while1intArray.GetArrayiArray1;pView-Invalidate;return 0;9.3.1 使用Critical Section void CThreadView:OnStartthread / TODO: Add your command handler code hereHWND hWnd = GetSafeHwnd;AfxBeginThreadWriteThreadProc, hWnd;AfxBeginThreadReadThreadProc, hWnd;9.3.1 使用C

20、ritical Section void CThreadTestView:OnDrawCDC* pDCchar str70;strcpystr,线程 1 为数组设置的值是: ;int len = strlenstr;wsprintf&strlen, %d , intSetNumber;pDC-TextOut30,30,str;strcpystr,线程 2 读到的值是: ;for int i=0; iTextOut30,50,str;9.3.2 使用使用Mutex互斥对象 将上例中的critical section交换成Mutex #include afxmt.hclass CIntAr

21、rayprivate:int array10;CMutex mutex;public:CIntArray ; CIntArray ;void SetArrayint value;void GetArrayint dstArray10;9.3.2 使用使用Mutex互斥对象 #include stdafx.h#include CIntArray.hCIntArray:CIntArray CIntArray:CIntArray void CIntArray:SetArrayint valueCSingleLock singleLock&mutex;singleLock.Lock;for i

22、nt x=0; x10; +xarrayx = value; void CIntArray:GetArrayint dstArray10CSingleLock singleLock&mutex;singleLock.Lock;for int x=0; x10; +xdstArrayx = arrayx; 9.3.3 使用信号量Semaphore 1创立信号量CSemaphore Semaphore2, 2;2创立一个CSingleLock对象 CSingleLock singleLocksemaphore;3减小信号量计数器 singleLock.Lock;4增加信号量计数器 sing

23、leLock.Unlock ;使用信号量的一个例子 1. 修改CIntArray类 #include afxmt.hclass CIntArrayprivate:int array10;CMutex mutex;CSemaphore *semaphore;public:CIntArray ; CIntArray ;void SetArrayint value;void GetArrayint dstArray10;使用信号量的一个例子 1. 修改CIntArray类 CIntArray:CIntArray semaphore = new CSemaphore2, 2; CIntArray:CI

24、ntArray delete semaphore; void CIntArray:SetArrayint valueCSingleLock singleLock&mutex;singleLock.Lock;for int x=0; x10; +xarrayx = value; void CIntArray:GetArrayint dstArray10C S i n g l e L o c k s i n g l e L o c ksemaphore;singleLock.Lock;for int x=0; xGetMainWnd;CThreadTestView *pView = CThreadTestView * pMainFrame-GetActiveView;while1intArray.GetArrayiArray2;pView-Invalidate;return 0;使用信号量的一个例子 5 5改写视类的改写视类的OnDrawOnDraw函数函数 UINT ReadThreadProc3LPVOID paramCThreadTestApp *pApp=CThreadTestApp *

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论