0001:
0002:
0003:
0004: #include "stdafx.h"
0005: #include <process.h>
0006: #include "CThread.h"
0007:
0008: namespace MySystem{
0009:
0010:
0011:
0012:
0013: CThreadMgr::CThreadMgr(unsigned ( __stdcall *func )( void * )
0014: , int thread_max
0015: , int work_max )
0016: {
0017: unsigned int dummy;
0018:
0019: m_ThreadMax = thread_max;
0020: m_WorkMax = work_max;
0021:
0022: m_hThread = new HANDLE[thread_max];
0023: m_pThread = new CThreadData[work_max];
0024: m_bThreadEnable = TRUE;
0025:
0026: for( int i = 0; i < thread_max; i++ )
0027: {
0028: m_hThread[i] = (HANDLE)_beginthreadex( NULL, 0, func, this, 0, &dummy );
0029: }
0030: }
0031:
0032:
0033:
0034:
0035: CThreadMgr::~CThreadMgr()
0036: {
0037: m_bThreadEnable = FALSE;
0038:
0039: for( int i = 0; i < m_ThreadMax; i++ )
0040: {
0041: WaitForSingleObject( m_hThread[i], INFINITE );
0042: CloseHandle( m_hThread[i] );
0043: }
0044:
0045: delete[] m_pThread;
0046: delete[] m_hThread;
0047: }
0048:
0049:
0050:
0051:
0052:
0053: int CThreadMgr::Req( void *pData )
0054: {
0055: for( int i = 0; i < m_WorkMax; i++ )
0056: {
0057: if( THREAD_DEAD == m_pThread[i].GetState() )
0058: {
0059: m_pThread[i].SetData( pData );
0060: m_pThread[i].SetState( THREAD_WAIT );
0061: return 0;
0062: }
0063: }
0064:
0065: return -1;
0066: }
0067:
0068:
0069:
0070:
0071:
0072: int CThreadMgr::GetLeftWork()
0073: {
0074: int count = 0;
0075:
0076: for( int i = 0; i < m_WorkMax; i++ )
0077: {
0078: if( THREAD_DEAD != m_pThread[i].GetState() ) count++;
0079: }
0080:
0081: return count;
0082: }
0083:
0084:
0085:
0086:
0087:
0088: CThreadData *CThreadMgr::GetWork()
0089: {
0090: for( int i = 0; i < m_WorkMax; i++ )
0091: {
0092: if(THREAD_WAIT == m_pThread[i].GetState())
0093: {
0094: m_pThread[i].SetState( THREAD_RUN );
0095: return &m_pThread[i];
0096: }
0097: }
0098:
0099: return NULL;
0100: }
0101: }
0102: