大较好!我自己编了一个线程的类!在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;//实际的参数!
}
{
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;//实际的参数!
}
解决方案 »
- 请问如何设计数据库服务器,防止提交SQL语句时读到脏数据
- VC对话框上的一个控件刷新显示问题,能者进。彀尽100分,问题不解决誓不结贴!
- CDib类具体怎么用,还有下面这段代码是什么意思,谁能给解析一下,谢!
- 请教,一个程序要运行几个小时才出错,应该怎么还原问题,调试问题?
- 怎样在VC中用API函数画菱形?再线等待
- CSDN中从未有人问过的东东:关于数据结构的!
- 请问图形方面的高手,有没有其它的类库或函数可以实现位图的缩放操作?调用CDC::Stretch时系统会被挂起。JPEGLIB有没有缩放功能?怎样实
- 看到的一个面试题,实在不能确定:VC6.0 int *a[3]会定义多大内存区
- 1bit卫星影像转8bit
- 动态绘图引起的抖动问题
- 函数返回值类型的引用与否
- 我准备自学vc++,高手给点建议吧
IThreadInterFace
bool OnThreadFun(LPVOID ) = NULL;
调用的类需要实现这个接口。线程类提供个方法,或者直接在构造函数中就需要传这个接口类型的参数。
如:class MLThread
{
MLThread(IThreadInterFace* pInferFace)
{
//保存起来,如m_pThreadInterface = pInferFace;
}
}//在MLThrad的线程函数中{
m_pThreadInterface ->OnThreadFun(pParam)//你还可以根据这个函数返回的结果true/false决定是否终止线程,面实现的代码就是调用者,业务逻辑也在调用者这里。 }
其实我的意思是说,没有对线程进行抽象,使用者使用你这个class和直接使用c接口区别不大。可以考虑一下几点:
1、如何让客户用的更爽,以最少的代价复用
2、线程做了,相关的周边设施也最好一起提供,如临界区、事件、互斥量等不过还是鼓励一下。顺便推荐一本书,win32多线程编程,里面有c++的线程封装。
#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使用。