第9章多线程 内容摘要: 1.创建线程 2.实现线程间通信 3.利用线程同步技术保障数据安全
第9章 多线程 内容摘要: 1. 创建线程 2. 实现线程间通信 3. 利用线程同步技术保障数据安全 返回目录
9.1 91创建线程 学习目标 调用 AfxBeginThread()来启动线程
9.1 创建线程 学习目标 调用AfxBeginThread()来启动线程。 9.1 返回第9章
9.1 程序的实现步骤 1.利用 App wizard生成程序框架( Thread Test) 编辑资源 3.添加菜单响应函数 4.编写线程函数 5.在视中输出信息
程序的实现步骤 1. 利用AppWizard生成程序框架(ThreadTest ) 2. 编辑资源 3. 添加菜单响应函数 4. 编写线程函数 5. 在视中输出信息 9.1
9.1 步骤1生成程序框架( Minutest) 1.项目名称: Thread Test 2.选择单文档界面应用程序( Single document)
步骤1 生成程序框架(MenuTest) 1. 项目名称: ThreadTest 2. 选择单文档界面应用程序(Single document) 9.1
9.1 步骤2编辑资源 1.编辑菜单资源 线程Pop-up选中 Caption 启动线程 ID THREAD START 其他任务 ID TREEAD OTHER 2编辑对话框资源 IDD DIALOG THRAED CDIgThread 启动了线程
步骤2 编辑资源 1.编辑菜单资源 线程 Pop-up 选中 Caption ID 启动线程 ID_THREAD_START 其他任务 ID_TREEAD_OTHER 2.编辑对话框资源 9.1 IDD_DIALOG_THRAED CDlgThread
9.1 步骤3添加菜单响应函数 Class Name Objects IDs Messages 1. CThread Test view ID THREAD START COMMAND 2. CThread Test view ID TREEAD OTHER COMMAND void CThreadTestView:: On Threadstarto HWND hWnd = GetsafeHwndo AfX Begin Thread(TreadProc, hWnd, THREAD PRIORITY NORMAL); void CThreadTestView: On Thraedothero CDIg Thread dg dIg DoModal;
步骤3 添加菜单响应函数 Class Name Objects IDs Messages 1. CThreadTestView ID_THREAD_START COMMAND 2. CThreadTestView ID_TREEAD_OTHER COMMAND 9.1 void CThreadTestView::OnThreadStart() { HWND hWnd = GetSafeHwnd(); AfxBeginThread(TreadProc, hWnd, THREAD_PRIORITY_NORMAL); } void CThreadTestView::OnThraedOther() { CDlgThread dlg; dlg.DoModal(); }
9.1 步骤4编写线程函数 1.在视类中添加两个成员变量。并在构造函数中初始化 class CThreadTestview: public Cview C Thread TestView: C Thread Testviey m strMessage="没有线程启动"; public: m itime =0 CString m strMessage int m iTime;
步骤4 编写线程函数 1. 在视类中添加两个成员变量。并在构造函数中初始化 9.1 class CThreadTestView : public CView { …… public: CString m_strMessage; int m_iTime; …… } CThreadTestView::CThreadTestView() { m_strMessage = "没有线程启动"; m_iTime = 0; }
9.1 步骤5在视中输出信息 void CThread Testview:: On DraW(CDC pDc) CThread TestDoc' pDoc GetDocumento ASSERT VALID(pDoc); lI TODO: add draw code for native data here char ch Number[6: itoa(m iTime, chNumber, 10); pDC->Textout(30, 30, m strMessage) pDC->Textout(30, 50, ch Number)
步骤5 在视中输出信息 9.1 void CThreadTestView::OnDraw(CDC* pDC) { CThreadTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here char chNumber[6]; itoa(m_iTime, chNumber, 10); pDC->TextOut(30,30, m_strMessage); pDC->TextOut(30,50,chNumber); }
2.线程函数 9.1 UINT TreadProc(LPVOID param) CThreadTestApp"pApp=(cThreadTestApp ")AfX GetAppo CMain Frame *pAin Frame =(CMain Frame *)pApp->GetMainWnd(; CThreadTestView pView =(CThreadTestview ")pAin Frame->GetActiveViewO pview> m-strMessage="启动了一个线程!"; while(pview->m_iTime 20) . Sleep (1000) pView->m iTime ++ pView->Invalidate pView->m iTime =0; pview> m strMMessage="线程结東!"; return 0;
2. 线程函数 9.1 UINT TreadProc(LPVOID param) { CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp(); CMainFrame *pMainFrame = (CMainFrame *)pApp->GetMainWnd(); CThreadTestView *pView = (CThreadTestView *) pMainFrame->GetActiveView(); pView->m_strMessage = "启动了一个线程!"; while(pView->m_iTime m_iTime ++; pView->Invalidate(); } pView->m_iTime =0; pView->m_strMessage = "线程结束!"; return 0; }
9.1 基本知识 CWnd类的 Getsafehwndo;返回窗口句柄 2. AfxBeginThread ( 3.线程函数(返回UINT) 4. CMain Frame: GetActive View 5.: Sleep(1000);
基本知识 1. CWnd类的GetSafeHwnd();返回窗口句柄 2. AfxBeginThread(); 3. 线程函数 ( 返回UINT) 4. CMainFrame::GetActiveView(); 5. ::Sleep(1000); 9.1