简单的线程类,采用event通信

#include  < Windows.h >
#include 
< iostream >

DWORD WINAPI threadProc(LPVOID lpParameter);

class  CThread
{
public :
    CThread()
    {
        m_hEvent 
=  ::CreateEvent(NULL,  true false , NULL);
        m_hThread 
=  ::CreateThread(
            NULL,
            
0 ,
            threadProc,
            
this ,
            
0 ,
            NULL);
        
// ::SetEvent(m_hEvent);
    }
    
~ CThread()
    {
        ::CloseHandle(m_hEvent);
        ::CloseHandle(m_hThread);
    }

public :
    
// 线程结束事件
     void  waitFor(DWORD dwTime)
    {
        ::SetEvent(m_hEvent);

        ::WaitForSingleObject(m_hThread, dwTime);
    }

public :
    HANDLE m_hThread;
    HANDLE m_hEvent;
};

DWORD WINAPI threadProc(LPVOID lpParameter)
{
    CThread 
* pThread  =  static_cast < CThread *> (lpParameter);
    
if  (pThread  ==  NULL)
    {
        
return   0 ;
    }

    
while ( 1 )
    {
        
char  ch[ 10 =  { 0 };
        
static   long  cnts  =   0 ;
        sprintf_s(ch,
10 " %d\n " ,cnts ++ );
        ch[
9 =   ' \0 ' ;

        DWORD ret 
=  ::WaitForSingleObject(pThread -> m_hEvent, 1000 );
        
if  (ret  ==  WAIT_TIMEOUT)
        {
            ::OutputDebugStringA(ch);
        }
        
else   if  (ret  ==  WAIT_OBJECT_0)
        {
            ::OutputDebugStringA(
" 线程结束\n " );
        }
        
else   if  (ret  ==  WAIT_ABANDONED)
        {
            ::OutputDebugStringA(
" 线程出错\n " );
        }
    }

    
return   - 1 ;
}


int  WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in  int  nShowCmd )
{
    CThread thread;
    
int  cnts  =   0 ;
    
while (cnts ++   <   500 )
    {
        ::Sleep(
1 );
    }
    thread.waitFor(
3000 );
    
return   0 ;
}

你可能感兴趣的:(event)