MFC中CreatThread()创建线程使用详解

 今天详细研究了下CreateThread()函数创建线程,并将其包装使用的方法,现在给大家讲解下:

MyThread.h  //头文件

 

class MyThread;

class ThreadCallback{   //线程回调类

public:

    virtual BOOL Run(MyThread* pCurThread)=0;

};

class MyThread{

public:

   void Init(ThreadCallback*pi ){return m_pi = pi;}

   MyThread();

   //析构函数

//.....

   BOOL Start();   //线程对象调用,创建线程

private:

    ThreadCallback* m_pi;

 private:

    static DWORD WINAPI ThreadProc(LPVOID lpParam); //线程函数

};

MyThread .cpp    //实现类

MyThread::MyThread(){....} //初始化成员变量

BOOL MyThread::Start(){  //start函数

    ...

//外部在用MyThead对象调用Start()后便创建了线程

   m_hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,this,0,(LPDWORD)&m_nThreadID);

}

DWORD WINAPI MyThread::ThreadProc(LPVOID lpParam){

    MyThread*  pthis = (MyThread*)lpParam;

    ASSERT(pthis&& pthis ->m_pi);

    BOOL bRun = pthis->m_pi->Run(pthis);//对象传入线程运行函数中,可以调用此对象结果中的其他成员

    CloseHandle(pThis->m_nThread);//线程退出时关闭

    。。。。

}

我想说的其实这是一种很高明的做法,首先我们定义的MyThread类其实就是一个封装了很多信息的类,其中有很多有用信息,比如说我可以定义控制线程退出的变量,线程句柄,线程ID,线程状态变量为此结构的成员变量,这样就可以很自然的监控线程状态。

 

以下在看看此创建的线程是如何被调用的

 

Cutter.h

 

   classCutter:public ThreadCallback{ //继承线程回调

public:

   Cutter(); //构造函数

proctected:

    virtual BOOL Run(MyThread*pCurThread);//线程回调覆盖

private:

   MyThread  mThread;

         

};

 

Cutter.cpp

Cutter::Cutter(){  //构造

     mThread.Init(this);  //这个初始化调用的是MyThead类中的,初始化了MyThread对象中的m_pi;

 }

 

以上是相关的代码:

在Cutter.cpp中需要启动线程的地方这样调用 mThread.Start() ;

分析下过程吧:Start()===>CreatThread()===>ThreadProc()===>myThread->m_pi->Run(myThread); 

就是这样的。这里调用的Run是Cutter里的,因为将基类中的Run给覆盖了,呵呵,其实还可以继续封装,凭个人的方法吧。

 

 

 

 

 

 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值