0001: // CBitmap.cpp : スレッドを管理する
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  // 最大スレッド数(CPUの数と同じ程度)
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: }//namespace MySystem;
0102: