S.l.e!ep.¢%

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

86 Line 线程封装类 only for Win32

Posted on 2009-02-07 17:03 S.l.e!ep.¢% 阅读(1732) 评论(3)  编辑 收藏 引用 所属分类: VC

 

 1 #include  < windows.h >
 2 #include  < process.h >
 3
 4 class  CThread
 5 {
 6 public :
 7     CThread()
 8      {
 9         m_hThread    =  INVALID_HANDLE_VALUE;
10         m_nThreadID  =   0 ;
11         m_pfnCall    =  NULL;
12     }

13
14      virtual   ~ CThread()
15      {
16         stop();
17     }

18
19      void  setObj(unsigned  int  ( * pfnCall)( void *  pVoid))
20      {
21         m_pfnCall  =  pfnCall;
22     }

23
24      static  unsigned __stdcall _ThreadProc( void *  pVoid)
25      {
26         CThread *  pThis  =  (CThread * )pVoid;
27
28          if  ( NULL  !=  pThis -> m_pfnCall )
29             pThis -> m_pfnCall(pVoid);
30
31          return   0 ;
32     }

33
34      bool  start( void *  pVoid)
35      {
36         m_hThread  =  (HANDLE)_beginthreadex(NULL,  0 , _ThreadProc, ( void   * ) this 0 & m_nThreadID);
37         
38          if  (  0   ==  m_hThread )
39              return   false ;
40          else
41              return   true ;
42     }

43
44      bool  stop()
45      {
46          #define  ONE_SECOND 1000
47
48          if  ( INVALID_HANDLE_VALUE  ==  m_hThread )
49              return   true ;
50
51         BOOL bRet    =  FALSE;
52         DWORD dwRet  =   0 ;
53
54         DWORD dwExitCode  =   0 ;
55          if ( TRUE  ==  ::GetExitCodeThread(m_hThread,  & dwExitCode) )
56          {
57              if ( STILL_ACTIVE  ==  dwExitCode )            
58                 dwRet  =  ::WaitForSingleObject(m_hThread, ONE_SECOND); 
59         }

60                 
61          if  ( dwRet  ==  WAIT_TIMEOUT  ||  dwRet  ==  WAIT_FAILED ) 
62          {
63             bRet  =  ::TerminateThread(m_hThread,  1 );
64         }

65          else
66          {
67             bRet  =  TRUE;
68         }

69                 
70         ::CloseHandle(m_hThread);
71
72          if  ( TRUE  ==  bRet )
73          {
74              return   true ;
75         }

76          else
77          {
78              return   false ;
79         }

80     }
    
81
82 private :
83     HANDLE       m_hThread;
84     unsigned  int  m_nThreadID;
85     unsigned  int  ( * m_pfnCall)( void *  pVoid) ;
86 }
;

Feedback

# re: 86 Line 线程封装类 only for Win32  回复  更多评论   

2009-02-07 17:51 by 陈梓瀚(vczh)
比起m_pfnCall,还是用virtual void Run()=0;好些。

# re: 86 Line 线程封装类 only for Win32  回复  更多评论   

2009-02-07 18:08 by S.l.e!ep.¢%
以前用 virtual void Run()=0; 造成类爆炸, 做一个功能要写一个类,原来在一个类写两个 static 函数就可以搞定的东西,没必要吧。

# re: 86 Line 线程封装类 only for Win32  回复  更多评论   

2009-02-26 23:42 by zhuxueling
我也实现过一个线程库。不过接口比你的简单。。
举个例子:
 1class Msg{
 2    void message( int t){
 3       std::cout << "message is: t" <<std::endl;
 4    }

 5}
;
 6
 7int main(){
 8   Msg    m;
 9   Thread t( m, &Msg::message, 22);
10   t.start();
11   t.join();
12   return 0;   
13}
我喜欢在线程创建时就执行,所以我用start方法,推迟执行。
join方法是等待线程终止的。
线程的构造函数很随意。。

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