C++多线程编程之五(二)

2014-11-24 03:18:19 · 作者: · 浏览: 1
c,


&Info);


}


在函数BOOL CMultiThread3Dlg::OnInitDialog()中添加语句:


{


……





// TODO: Add extra initialization here


m_ctrlProgress.SetRange(0,99);


m_nMilliSecond=10;


UpdateData(FALSE);


return TRUE; // return TRUE unless you set the focus to a control


}


添加线程处理函数:


UINT ThreadFunc(LPVOID lpParam)


{


threadInfo* pInfo=(threadInfo*)lpParam;


for(int i=0;i<100;i++)


{


int nTemp=pInfo->nMilliSecond;





pInfo->pctrlProgress->SetPos(i);





Sleep(nTemp);


}


return 0;


}


MFC 类库编程实现用户界面线程


创建用户界面线程的步骤:


使用ClassWizard创建类CWinThread的派生类(以CUIThread类为例)


class CUIThread : public CWinThread


{


DECLARE_DYNCREATE(CUIThread)


protected:


CUIThread(); // protected constructor used by dynamic creation





// Attributes


public:





// Operations


public:





// Overrides


// ClassWizard generated virtual function overrides


//{{AFX_VIRTUAL(CUIThread)


public:


virtual BOOL InitInstance();


virtual int ExitInstance();


//}}AFX_VIRTUAL





// Implementation


protected:


virtual ~CUIThread();





// Generated message map functions


//{{AFX_MSG(CUIThread)


// NOTE - the ClassWizard will add and remove member functions here.


//}}AFX_MSG





DECLARE_MESSAGE_MAP()


};


重载函数InitInstance()和ExitInstance()。


BOOL CUIThread::InitInstance()


{


CFrameWnd* wnd=new CFrameWnd;


wnd->Create(NULL,UI Thread Window);


wnd->ShowWindow(SW_SHOW);


wnd->UpdateWindow();


m_pMainWnd=wnd;


return TRUE;


}


创建新的用户界面线程


void CUIThreadDlg::OnButton1()


{


CUIThread* pThread=new CUIThread();


pThread->CreateThread();


}


请注意以下两点:


A、在UIThreadDlg.cpp的开头加入语句: #include UIThread.h


B、把UIThread.h中类CUIThread()的构造函数的特性由 protected 改为 public。


  用户界面线程的执行次序与应用程序主线程相同,首先调用用户界面线程类的InitInstance()函数,如果返回TRUE,继续调用线程的Run()函数,该函数的作用是运行一个标准的消息循环,并且当收到WM_QUIT消息后中断,在消息循环过程中,Run()函数检测到线程空闲时(没有消息),也将调用OnIdle()函数,最后Run()函数返回,MFC调用ExitInstance()函数清理资源。