1、定义线程指针
CWinThread是MFC类。CWinThread类https://baike.baidu.com/item/CWinThread%E7%B1%BB/5972618?fromModule=lemma_inlinkCWinThread类CWinThread类是MFC用来封装线程的,包括UI线程和工作者线程。
CWinThread *pThreadPt;
2、声明线程入口函数
UINT ThreadPt(LPVOID pParam);
3、创建线程
pThreadPt = AfxBeginThread
(ThreadPt,
this,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pThreadPt->m_bAutoDelete = TRUE;
pThreadPt->ResumeThread(); //启动线程
3.1、线程函数
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc , LPVOID pParam , int nPriority = THREAD_PRIORITY_NORMAL , UINT nStackSize = 0 , DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
3.2、线程函数各参数说明
(1)返回值:一个指向新线程的线程对象。
(2)pfnThreadProc:线程的入口函数,声明一定要如下:UINT MyThreadFunction( LPVOID pParam );
(3)pParam:传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程。
(4)nPriority:线程的优先级,一般设置为 0。让它和主线程具有共同的优先级。
(5)nStackSize:指定新创建的线程的栈的大小。如果为 0,新创建的线程具有和主线程一样的大小的栈。
(6)dwCreateFlags:指定创建线程以后,线程有怎么样的标志。可以指定两个值:
<1>CREATE_SUSPENDED:线程创建以后,会处于挂起状态,直到调用 ResumeThread;
<2>0:创建线程后就开始运行。
(7)lpSecurityAttrs:指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性。如果为 NULL,那么新创建的线程就具有和主线程一样的安全性。
3.3、线程等待与唤醒
(1)让线程等待(暂时挂起):
MyThread->SuspendThread();
(2)唤醒暂停的线程:
MyThread->ResumeThread();
3.4、查看线程状态
DWORD code;
GetExitCodeThread(MyThread->m_hThread , &code);
if(code==STILL_ACTIVE){//线程仍在执行}
else {//线程停止执行}
4、线程工作函数(线程会在while中循环执行功能)
UINT ThreadPt(LPVOID pParam)
{
CMotionDlg *pDlg = (CMotionDlg*)pParam;
While(pDlg->Status)
{
.....
}
return 0;
}
当pDlg->Status置为FLASE时,线程结束或执行TerminateThread函数结束
TerminateThread(ThreadPt , 0);