S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JetByteTools(二)

Posted on 2009-09-20 16:53 S.l.e!ep.¢% 阅读(1267) 评论(1)  编辑 收藏 引用 所属分类: IOCP

IOCP 跟线程池脱不了关系

以前写过一个线程类
http://www.cppblog.com/sleepwom/archive/2009/02/07/73161.html

JetByteTools里的线程类是这样的,作了一些小改动

今天才知道,原来C++的虚函数可以写成 private: ......

    private :

      
virtual unsigned int Run() = 0

#if  defined (_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

#ifndef JETBYTE_TOOLS_WIN32_THREAD_INCLUDED__
#define  JETBYTE_TOOLS_WIN32_THREAD_INCLUDED__
////////////////////////////////////////////////////////////////////////////// /
//
//  File           : $Workfile: Thread.h $
//  Version        : $Revision: 3 $
//  Function       : 
//
//  Author         : $Author: Len $
//  Date           : $Date: 20/05/02 23:17 $
//
//  Notes          : 
//
//  Modifications  :
//
//  $Log: /Clients/PayPoint/e-Voucher/JetByteTools/Win32Tools/Thread.h $
//  
//  3     20/05/02 23:17 Len
//  Updated copyright and disclaimers.
//  
//  2     10/05/02 19:25 Len
//  Lint options and code cleaning.
//  
//  1     9/05/02 18:47 Len
//  
////////////////////////////////////////////////////////////////////////////// /
//
//  Copyright 1997 - 2002 JetByte Limited.
//
//  JetByte Limited grants you ("Licensee") a non-exclusive, royalty free, 
//  licence to use, modify and redistribute this software in source and binary 
//  code form, provided that i) this copyright notice and licence appear on all 
//  copies of the software; and ii) Licensee does not utilize the software in a 
//  manner which is disparaging to JetByte Limited.
//
//  This software is provided "as is" without a warranty of any kind. All 
//  express or implied conditions, representations and warranties, including
//  any implied warranty of merchantability, fitness for a particular purpose
//  or non-infringement, are hereby excluded. JetByte Limited and its licensors 
//  shall not be liable for any damages suffered by licensee as a result of 
//  using, modifying or distributing the software or its derivatives. In no
//  event will JetByte Limited be liable for any lost revenue, profit or data,
//  or for direct, indirect, special, consequential, incidental or punitive
//  damages, however caused and regardless of the theory of liability, arising 
//  out of the use of or inability to use software, even if JetByte Limited 
//  has been advised of the possibility of such damages.
//
//  This software is not designed or intended for use in on-line control of 
//  aircraft, air traffic, aircraft navigation or aircraft communications; or in 
//  the design, construction, operation or maintenance of any nuclear 
//  facility. Licensee represents and warrants that it will not use or 
//  redistribute the Software for such purposes. 
//
////////////////////////////////////////////////////////////////////////////// /

////////////////////////////////////////////////////////////////////////////// /

//  Lint options
//
// lint -save
// lint -esym(1704, CThread::CThread)   private (copy) constructor 
//
////////////////////////////////////////////////////////////////////////////// /

#ifndef _WINDOWS_
#define  WIN32_LEAN_AND_MEAN
#include 
< windows.h >
#undef  WIN32_LEAN_AND_MEAN
#endif



////////////////////////////////////////////////////////////////////////////// /
//  Namespace: JetByteTools::Win32
////////////////////////////////////////////////////////////////////////////// /

namespace  JetByteTools  {
namespace  Win32  {

////////////////////////////////////////////////////////////////////////////// /
//  CThread
////////////////////////////////////////////////////////////////////////////// /

class  CThread 
{
   
public  :
   
      CThread();
      
      
virtual   ~ CThread();

      HANDLE GetHandle();

      
void  Wait()  const ;

      
bool  Wait(DWORD timeoutMillis)  const ;

      
void  Start();

      
void  Terminate(DWORD exitCode  =   0 );

   
private  :

      
virtual  unsigned  int  Run()  =   0 ;

      
static  unsigned  int  __stdcall ThreadFunction( void   * pV);

      HANDLE m_hThread;

      
//  No copies do not implement
      CThread( const  CThread  & rhs);
      CThread 
& operator = ( const  CThread  & rhs);
}
;

////////////////////////////////////////////////////////////////////////////// /
//  Namespace: JetByteTools::Win32
////////////////////////////////////////////////////////////////////////////// /

}
  //  End of namespace Win32
}
  //  End of namespace JetByteTools 

////////////////////////////////////////////////////////////////////////////// /
//  Lint options
//
// lint -restore
//
////////////////////////////////////////////////////////////////////////////// /

#endif   //  JETBYTE_TOOLS_WIN32_THREAD_INCLUDED__

////////////////////////////////////////////////////////////////////////////// /
//  End of file
////////////////////////////////////////////////////////////////////////////// /


////////////////////////////////////////////////////////////////////////////// /
//
//  File           : $Workfile: Thread.cpp $
//  Version        : $Revision: 3 $
//  Function       : 
//
//  Author         : $Author: Len $
//  Date           : $Date: 20/05/02 23:17 $
//
//  Notes          : 
//
//  Modifications  :
//
//  $Log: /Clients/PayPoint/e-Voucher/JetByteTools/Win32Tools/Thread.cpp $
//  
//  3     20/05/02 23:17 Len
//  Updated copyright and disclaimers.
//  
//  2     10/05/02 19:25 Len
//  Lint options and code cleaning.
//  
//  1     9/05/02 18:47 Len
//  
////////////////////////////////////////////////////////////////////////////// /
//
//  Copyright 1997 - 2002 JetByte Limited.
//
//  JetByte Limited grants you ("Licensee") a non-exclusive, royalty free, 
//  licence to use, modify and redistribute this software in source and binary 
//  code form, provided that i) this copyright notice and licence appear on all 
//  copies of the software; and ii) Licensee does not utilize the software in a 
//  manner which is disparaging to JetByte Limited.
//
//  This software is provided "as is" without a warranty of any kind. All 
//  express or implied conditions, representations and warranties, including
//  any implied warranty of merchantability, fitness for a particular purpose
//  or non-infringement, are hereby excluded. JetByte Limited and its licensors 
//  shall not be liable for any damages suffered by licensee as a result of 
//  using, modifying or distributing the software or its derivatives. In no
//  event will JetByte Limited be liable for any lost revenue, profit or data,
//  or for direct, indirect, special, consequential, incidental or punitive
//  damages, however caused and regardless of the theory of liability, arising 
//  out of the use of or inability to use software, even if JetByte Limited 
//  has been advised of the possibility of such damages.
//
//  This software is not designed or intended for use in on-line control of 
//  aircraft, air traffic, aircraft navigation or aircraft communications; or in 
//  the design, construction, operation or maintenance of any nuclear 
//  facility. Licensee represents and warrants that it will not use or 
//  redistribute the Software for such purposes. 
//
////////////////////////////////////////////////////////////////////////////// /

#include 
" Thread.h "

#include 
< process.h >

#include 
" Win32Exception.h "
#include 
" Utils.h "

////////////////////////////////////////////////////////////////////////////// /
//  Lint options
//
// lint -save
// lint -esym(1763, CThread::GetHandle) const member indirectly modifies obj
//
//  Member not defined
// lint -esym(1526, CThread::CThread)
// lint -esym(1526, CThread::operator=)
//
////////////////////////////////////////////////////////////////////////////// /

////////////////////////////////////////////////////////////////////////////// /

//  Namespace: JetByteTools::Win32
////////////////////////////////////////////////////////////////////////////// /

namespace  JetByteTools  {
namespace  Win32  {

////////////////////////////////////////////////////////////////////////////// /
//  CThread
////////////////////////////////////////////////////////////////////////////// /

CThread::CThread()
   :  m_hThread(INVALID_HANDLE_VALUE)
{

}

      
CThread::
~ CThread()
{
   
if  (m_hThread  !=  INVALID_HANDLE_VALUE)
   
{
      (
void ) ::CloseHandle(m_hThread);
   }


   m_hThread 
=  NULL;

   
// lint -e{1540} m_hThread neither freed nor zeroed in destructor
}


HANDLE CThread::GetHandle()
{
   
return  m_hThread;
}


void  CThread::Start()
{
   
if  (m_hThread  ==  INVALID_HANDLE_VALUE)
   
{
      unsigned 
int  threadID  =   0 ;

      m_hThread 
=  (HANDLE)::_beginthreadex( 0 0 , ThreadFunction, ( void * ) this 0 & threadID);

      
if  (m_hThread  ==  INVALID_HANDLE_VALUE)
      
{
         
throw  CWin32Exception(_T( " CThread::Start() - _beginthreadex " ), GetLastError());
      }

   }

   
else
   
{
      
throw  CException(_T( " CThread::Start() " ), _T( " Thread already running - you can only call Start() once! " ));
   }

}


void  CThread::Wait()  const
{
   
if  ( ! Wait(INFINITE))
   
{
      
throw  CException(_T( " CThread::Wait() " ), _T( " Unexpected timeout on infinite wait " ));
   }

}


bool  CThread::Wait(DWORD timeoutMillis)  const
{
   
//  TODO base class? Waitable?
    bool  ok;

   DWORD result 
=  ::WaitForSingleObject(m_hThread, timeoutMillis);

   
if  (result  ==  WAIT_TIMEOUT)
   
{
      ok 
=   false ;
   }

   
else   if  (result  ==  WAIT_OBJECT_0)
   
{
      ok 
=   true ;
   }

   
else
   
{
      
throw  CWin32Exception(_T( " CThread::Wait() - WaitForSingleObject " ), ::GetLastError());
   }

    
   
return  ok;
}


unsigned 
int  __stdcall CThread::ThreadFunction( void   * pV)
{
   unsigned 
int  result  =   0 ;

   CThread
*  pThis  =  (CThread * )pV;
   
   
if  (pThis)
   
{
      
try
      
{
         result 
=  pThis -> Run();
      }

      
catch ()
      
{
          DEBUG_ONLY(Output(_T(
" CThread::ThreadFunction() - Unknown Exception " )) );
      }

   }


   
return  result;
}


void  CThread::Terminate(
   DWORD exitCode 
/*  = 0  */ )
{
   
if  ( ! ::TerminateThread(m_hThread, exitCode))
   
{
      
//  TODO we could throw an exception here
   }

}


////////////////////////////////////////////////////////////////////////////// /
//  Namespace: JetByteTools::Win32
////////////////////////////////////////////////////////////////////////////// /

}
  //  End of namespace Win32
}
  //  End of namespace JetByteTools 

////////////////////////////////////////////////////////////////////////////// /
//  Lint options
//
// lint -restore
//
////////////////////////////////////////////////////////////////////////////// /

////////////////////////////////////////////////////////////////////////////// /

//  End of file
////////////////////////////////////////////////////////////////////////////// /


使用也很简单
#include <stdio.h>
#include 
"Thread.h"

class CThreadTest : public JetByteTools::Win32::CThread
{
public:

private:
    
virtual unsigned int Run()
    
{
        printf(
"Run Thread\n");
        
        
while(true)
        
{
        }


        
return 0;
    }

}
;

int main()
{
    CThreadTest test;
    test.Start();
    
    (
void)test.Wait(1000);

    test.Terminate();

    printf(
"success\n");
    
return 0;
}


调用 start() 线程就开始,退出程序时,如果允许就 wait(), 如果很急,就直接 Terminate(),

Feedback

# re: JetByteTools(二)   回复  更多评论   

2009-09-21 15:18 by 一猪
JetByteTools代码可以提供一份吗?写了,好了好久没找到免费下载的。多谢了!
邮箱: zhlong.1988@163.com

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理