第9章多线程 内容摘要: 1.创建线程 2.实现线程间通信 3.利用线程同步技术保障数据安全
第9章 多线程 内容摘要: 1. 创建线程 2. 实现线程间通信 3. 利用线程同步技术保障数据安全 返回目录
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; }