WEB开发网
开发学院软件开发VC 如何让程序自动管理线程 阅读

如何让程序自动管理线程

 2010-08-15 20:46:26 来源:WEB开发网   
核心提示:下面介绍线程ThreadTaskpro(); 该线程最主要的目的就是 调用ThreadTask的CloseThreadHandles()函数,实现如下:DWORD WINAPI ThreadTaskpro( LPVOID pParam){HANDLE hCurrentThread = GetCurrentThread(

下面介绍线程ThreadTaskpro(); 该线程最主要的目的就是 调用ThreadTask的CloseThreadHandles()函数,实现如下:

DWORD WINAPI ThreadTaskpro( LPVOID pParam )
{
  HANDLE hCurrentThread = GetCurrentThread();
  //获得该线程句柄
   SetThreadPriority( hCurrentThread, THREAD_PRIORITY_LOWEST );
   //设为最低
  while ( ThreadTask::GetThreadTask().m_bKeepGoing )
  {
    Sleep(500);
  //休息500mms

    ThreadTask::GetThreadTask().CloseThreadHandles();
  }

  SetThreadPriority( hCurrentThread, THREAD_PRIORITY_NORMAL );
  return( 0 );
}

ThreadTask类到这就介绍完了,下 面我们看看ThreadManager类的实现,其实它的工作已很小,就是启动要管理的线 程(在构造函数中完成),并控制ThreadTask类。具体实现:

ThreadManager::ThreadManager(ThreadPro threadpro, LPVOID pParam)
{
  DWORD nThreadId = 0;
   _ASSERTE( ThreadTask::GetThreadTask().IsValid() );
  //运行ThreadTask类
  m_Handle = (HANDLE)::CreateThread(NULL,0,threadpro,(LPVOID) pParam,0,&nThreadId );
  //创建要管理的线程,并返回句柄
  if ( ThreadTask::GetThreadTask().m_bKeepGoing )
  {
    //如果ThreadTask运行了的话 
    ASSERT( m_Handle );
    ThreadTask::GetThreadTask().AddHandle( m_Handle );
    //把句柄加入ThreadTask类中,以便管理
  } 
}
ThreadManager::~ThreadManager()
{
}
BOOL  ThreadManager::RunThread()
{
  //运行线程
  return( ::ResumeThread( m_Handle ) != 0xFFFFFFFF );
}

整在机制就 介绍完了。

使用方法

使用方法相当简单,比如说,我要运行进程 MyThread1,并传入参数m_pro,只要用以下代码就可以了:

ThreadManager ThreadManager( &MyThread1, (LPVOID)m_pro );
  ThreadManager.RunThread();

就可以了,用这种方法创 的线程,会自动由ThreadManager类管理,并在完成的工作时,自动释放线程资源 。 我做了一个示例,大家可以试着运行一下。

本文配套源码

上一页  1 2 3 4 

Tags:如何 程序 自动

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接