大较好!我自己编了一个线程的类!在VC++6.0调了还可以!但是总感觉写的不是很爽!因为不同的线程函数需要另外编写!请大家给点意见谢谢!class MLThread  
{
public:
CWinThread* pThread;//线程指针!
LPVOID   Param;     //外部参数!
HANDLE TerminateEvent; //终止线程事件!public:
BOOL IsTerminate();
BOOL Init(LPVOID mParam=NULL);
BOOL Stop();
BOOL Start(AFX_THREADPROC ThreadFun,LPVOID mParam=NULL);
MLThread();
MLThread(AFX_THREADPROC ThreadFun,LPVOID mParam=NULL);
virtual ~MLThread();};#include "stdafx.h"
#include <MLThread.h>#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////MLThread::MLThread()
{
pThread=NULL;
Param=NULL;
TerminateEvent=INVALID_HANDLE_VALUE;
}MLThread::MLThread(AFX_THREADPROC ThreadFun,LPVOID mParam)
{
MLThread();
Init(mParam);
Start(ThreadFun,Param);
}MLThread::~MLThread()
{
Stop();
// delete Param;
Param=NULL;
CloseHandle(TerminateEvent);
TerminateEvent=INVALID_HANDLE_VALUE;
}BOOL MLThread::Start(AFX_THREADPROC ThreadFun,LPVOID mParam)

if(!pThread)
{
Init(mParam); ResetEvent(TerminateEvent); pThread= AfxBeginThread(ThreadFun,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
pThread->m_bAutoDelete = FALSE;   //线程不能自动结束,必须手工结束
pThread->ResumeThread();          //恢复线程运行
}
else
{
return FALSE;
} return TRUE;
}BOOL MLThread::Stop()
{
if (!pThread)
{
return FALSE;
} SetEvent(TerminateEvent);

//如果2秒线程不退出!
if(!(WAIT_OBJECT_0 == WaitForSingleObject(pThread->m_hThread,2000)))
{
DWORD ExitCode;
GetExitCodeThread(pThread->m_hThread,&ExitCode);
AfxEndThread(ExitCode,FALSE);

if (WAIT_OBJECT_0 == WaitForSingleObject(pThread->m_hThread,1000)) 
{
delete pThread;
pThread=NULL;
}
else
{
return FALSE;
}
}
else
{
delete pThread;
pThread=NULL;
} return TRUE;
}BOOL MLThread::Init(LPVOID mParam)
{
//创建事件!
if (TerminateEvent==INVALID_HANDLE_VALUE)
{
TerminateEvent=CreateEvent(NULL,TRUE, FALSE, NULL);
} //传递参数!
Param=mParam; return TRUE;
}BOOL MLThread::IsTerminate()
{
return (WAIT_OBJECT_0 == WaitForSingleObject(TerminateEvent,0));
}UINT ThreadFunc(LPVOID mParam)
{
    MLThread* Thread=(MLThread*)mParam;//MLCom类!
    MLCom* myCom=(MLCom*)Thread->Param;//实际的参数!

解决方案 »

  1.   

    可以使用接口,Start创建线程的时候,调用本地线程函数,然后凋用接口的方法。
      

  2.   

    比如:定义一个接口
    IThreadInterFace
    bool OnThreadFun(LPVOID ) = NULL;
    调用的类需要实现这个接口。线程类提供个方法,或者直接在构造函数中就需要传这个接口类型的参数。
    如:class MLThread 
    {
         MLThread(IThreadInterFace* pInferFace)
         {
           //保存起来,如m_pThreadInterface = pInferFace;
          }
    }//在MLThrad的线程函数中{
           m_pThreadInterface ->OnThreadFun(pParam)//你还可以根据这个函数返回的结果true/false决定是否终止线程,面实现的代码就是调用者,业务逻辑也在调用者这里。 }
      

  3.   

    坦白说,可复用性不高,只是把c形式的接口包装了一下,没有实质性的思想转变。
    其实我的意思是说,没有对线程进行抽象,使用者使用你这个class和直接使用c接口区别不大。可以考虑一下几点:
    1、如何让客户用的更爽,以最少的代价复用
    2、线程做了,相关的周边设施也最好一起提供,如临界区、事件、互斥量等不过还是鼓励一下。顺便推荐一本书,win32多线程编程,里面有c++的线程封装。
      

  4.   

    //轻量级线程
    #include <windows.h>
    #include <process.h>typedef HANDLE pthread_t;
    namespace king
    { class lw_abstract_thread
    {
    public: virtual ~lw_abstract_thread() {}
    virtual void run() = 0; static unsigned __stdcall lw_thread_routine( void * pv )
    {
    std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) ); pt->run(); return 0;
    } public:
    static int pthread_create( pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg )
    {
    HANDLE h = (HANDLE)_beginthreadex( 0, 0, start_routine, arg, 0, 0 ); if( h != 0 )
    {
    *thread = h;
    return 0;
    }
    else
    {
    return EAGAIN;
    }
    } static int pthread_join( pthread_t thread, void ** /*value_ptr*/ )
    {
    ::WaitForSingleObject( thread, INFINITE );
    ::CloseHandle( thread );
    return 0;
    }
    }; template<class F> class lw_thread_impl: public lw_abstract_thread
    {
    public: explicit lw_thread_impl( F f ): f_( f )
    {
    } void run()
    {
    f_();
    } private: F f_;
    }; template<class F> int lw_thread_create( pthread_t & pt, F f )
    {
    std::auto_ptr<lw_abstract_thread> p( new lw_thread_impl<F>( f ) ); int r = lw_abstract_thread::pthread_create( &pt, 0, lw_abstract_thread::lw_thread_routine, p.get() ); if( r == 0 )
    {
    p.release();
    } return r;
    }
    }配合boost::bind使用。