AfxBeginThread
AfxBeginThread有两个重载版本:一个用于用户界面线程,一个用于辅助线程。其中用户界面线程通常用于处理用户输入和响应用户事件,这些行为独立于执行应用程序他部分的线程。
下面列举创建用户界面线程的函数声明
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority=THREAD_PRIORITY_NORMAL,
UINT nStackSize=0,
DWORD dwCreateFlags=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
pThreadClass:从CWinThread派生的类的RUNTIME_CLASS.
nPriority:(可选)所需的优先级别。默认值为正常优先级。
nStackSize:(可选)所需的线程堆栈大小。默认值与创建线程的堆本大小相同。
dwCreateFlags:(可选)CREATE_SUSPEND,如果希望在挂起状态中创建线程。默认值为0,即正常启动线程。
lpSecurityAttrs:(可选)所需的安全属性。默认值与父线程具有相同的访问权。
创建用户界面线程时,必须首先从CWinThread派生类。必须使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏声明并实现此类。此类必须重写某些函数,也可以重写其他函数。下表列出这些函数及其用途
函数 | 用途 |
ExitInstance | 线程终止时执行清除 |
InitInstance | 执行线程实例初始化。必须重写 |
OnIdle | 执行线程特定的闲置时间处理。通常不重写 |
PreTranslateMessage | 将消息调度到TranslateMessage和DispatchMessage之前对其进行筛选。通常不重写。 |
ProcessWndProcException | 截获由线程的消息和命令处理程序引发的未处理异常。通常不生写 |
Run | 控制线程的函数。包含消息泵。一般不重写。 |
BOOL CUIThread::InitInstance() { // TODO: perform and per-thread initialization here CUIDlg *pDlg=new CUIDlg; pDlg->Create(IDD_DIALOG1); //创建非模态对话框 pDlg->ShowWindow(SW_SHOW); //显示对话 m_pMainWnd = pDlg; //将对话框设为主窗口 return TRUE; } int CUIThread::ExitInstance() { // TODO: perform any per-thread cleanup here if(m_pMainWnd!= NULL) delete m_pMainWnd; //删除动态指针 return CWinThread::ExitInstance(); }
void CUIThreadDemoView::OnUiThread() { // TODO: Add your command handler code her //使用AfxBeginThread函数启动用户界面线程 CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CUIThread),0,0,NULL); }