MFC AfxBeginThread

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的方式,一种是全局函数,一种是静态类成员.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值