MFC AfxBeginThread

来源:互联网 发布:ios手机编程就业 编辑:程序博客网 时间:2024/05/21 11:53
class CCar {public: void StartMyCountThread(LPVOID pv); void StartMyThread(LPVOID pv); static  UINT ThreadCountProc(LPVOID pParam);//静态类成员 CCar(); CWinThread *m_pWt; CWinThread *m_pCWt; virtual ~CCar();}; //将线程处理过程定义成类的静态成员函数UINT CCar::ThreadCountProc(LPVOID pParam){ CThreadTestDlg *m_TD = (CThreadTestDlg*)pParam; CString strTmp = ""; if (m_TD == NULL)   return 0; while(1) {  strTmp.Format("%d",nCount);        m_TD->m_strCount = strTmp;  //简单记数  Sleep(1000);  nCount++;  } return 0;}  int tick = 0; //下面这个定义成全局的形式UINT ThreadProc(LPVOID pv){ tick = (int)pv; while(1) {      tick++;     CString strTick = "";     strTick.Format("%d",tick);      AfxMessageBox("i am ThreadProc..."+strTick);      Sleep(2000); } return 0;}  //启动全局形式的线程void CCar::StartMyThread(LPVOID pv){ m_pWt = AfxBeginThread(ThreadProc,  pv,  THREAD_PRIORITY_NORMAL,  0,  CREATE_SUSPENDED,  0); m_pWt->ResumeThread();}  //启动静态类成员形式的线程void CCar::StartMyCountThread(LPVOID pv){ m_pCWt = AfxBeginThread(ThreadCountProc,  pv,THREAD_PRIORITY_NORMAL,  0,  CREATE_SUSPENDED,  0); m_pCWt->ResumeThread();} 最后我试了下多次调用StartMyThread,现象是会启动多个ThreadProc线程,他们都会AfxMessageBox("i am ThreadProc..."+strTick);所以最后观察到的是AfxMessageBox("i am ThreadProc..."+strTick);的速度变快了...那么我想m_pWt 指针指向的应该就是最后一个建立起来的线程了. 下面对AfxBeginThread函数各个参数详细了解下:CWinThread*AfxBeginThread(AFX_THREADPROC pfnThreadProc,LPVOID pParam,nPriority=THREAD_PRIORITY_NORMAL,UINT=0,DWORD dwCreateFlags=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);pfnThreadProc:指向人工辅助线程的执行函数的指针,执行函数定义该线程。当进入该函数时,线程启动;退出时,线程终止;该指针不能为NULL,且原型必须声明如下:UINT ExecutingFunction (LPVOID pParam);请注意,ExecutingFunction()应返回一个UINT类型的值,用以指明该函数结束的原因。一般情况下,返回0表明执行成功,其他值分别用来代表不同的错误情况。pParam:在线程启动时传递给其执行函数ExecutingFunction的一个单精度32位参数;执行函数将用某种方式解释该值。它可以是数值,或是指向包括多个参数的结构的指针,甚至可以被忽略。如果该参数是指结构,则不仅可以将数据从调用函数传给线程,也可以从线程回传给调用函数。如果使用这样的结构回传数据,当结果准备好的时候,线程要通知调用函数。nPriority:线程的优先级。如果为0,则线程和其父线程具有相同的优先级。nStackSize:线程为自用堆栈分配的地址空间大小,其单位为字节。如果dwStackSize被设为0,则线程的堆栈被设置成与主线程堆栈有相同大小。dwCreateFlags :控制线程创建的标志。如果为0,则线程在创建后立刻开始执行。如果为CREATE_SUSPEND,则线程在创建后立即被挂起,其挂起状态计数器被置为1。LpSecurityAttrs:线程的安全属性指针,同API函数CreateThread()中的参数说明。  另一种参数形式:CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass,int nPriority= THREAD_PRIORITY_NORMAL,UINT nStackSize = 0,DWORD dwCreateFlags = 0,LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );PThreadClass是指向CWinThread的一个导出类的运行时类对象的指针,该导出类定义了被创建的用户界面线程的启动、退出等;其他参数的意义同形式一。使用函数的这个原型时,生成的线程也有消息机制,在以后的例子中我们将发现同主线程的机制几乎一样。下面我们详细说明一下CWinThread类。CWinThread类的对象描述了进程中线程的执行,进程的主线程执行通常由CWinThread类的导出类CWinApp的派生对象所提供。在MFC中,用户界面线程对象都是CwinThread类的导出类的对象。CWinThread类的数据成员及重要成员函数的用法简要说明如下。m_bAutoDelete:布尔变量,在创建CWinThread类的对象时置为TURE,对象在线程终结时被系统删除;置为FALSE时,该对象在其相应线程终结时仍然存在。m_hThread:当前线程的句柄。m_nThreadID:当前线程的ID。m_pMainWnd:指向应用程序主窗口的指针。m_pActiveWnd:指向当前活动窗口的指针。CWinThread::CWinThread():用于创建CWinThread类的一个对象。  对于多个线程之间数据互斥访问的问题可以采用,Cevent、CcriticalSection、Cmutex、CSemaphore这些来巧妙解决,至于怎么解决,试两个就知道了....

 用了c++这么久,总是囫囵吞枣,从来没有仔细分析过代码为什么这样写,程序是如何工作的呢?今天突然想小试下AfxBeginThread,相信很多业界的都这个了如指掌了,本人也没有什么别的,只是把自己实验的结果写下来,总结下,为了过几天又忘记的时候,可以翻翻my blog看看...
我自己定义了一个CCar类,准备定义2种ThreadProc的方式,一种是全局函数,一种是静态类成员.





原创粉丝点击