示例#1
0
bool CThreadPoolExecutor::Init(unsigned int minThreads, unsigned int maxThreads, unsigned int maxPendingTasks)
{
	if (minThreads == 0)
	{
		return false;
	}
	if (maxThreads < minThreads)
	{
		return false;
	}
	m_minThreads = minThreads;
	m_maxThreads = maxThreads;
	m_maxPendingTasks = maxPendingTasks;
	unsigned int i = m_ThreadPool.size();
	for (; i<minThreads; i++)
	{
		//创建线程  
		CWorker * pWorker = new CWorker(this);
		if (NULL == pWorker)
		{
			return false;
		}
		EnterCriticalSection(&m_csThreadPoolLock);
		m_ThreadPool.insert(pWorker);
		LeaveCriticalSection(&m_csThreadPoolLock);
		pWorker->Start();
	}
	m_bRun = true;
	m_bEnableInsertTask = true;
	return true;
}
示例#2
0
bool CNppThreadPool::Initialize(unsigned int minThreads, unsigned int maxThreads)
{
    if (m_bInitialized)
        return false;
    
    if(minThreads <= 0)
    {
        minThreads = 1;
    }
    if(maxThreads < minThreads)
    {
        return false;
    }
    m_minThreads = minThreads;
    m_maxThreads = maxThreads;
    unsigned int i = _GetCurrentThreadPoolSize();
    for(; i<minThreads; i++)
    {
        //create thread workers
        CWorker * pWorker = new(std::nothrow) CWorker(this);
        if(NULL == pWorker)
        {
            return false;
        }
        pWorker->Start();
        _WorkerJumpIntoPool(pWorker);
    }
    m_bInitialized = true;
    m_bRun = true;
    m_bEnableInsertTask = true;
    return true;
}
示例#3
0
bool CThreadPoolExecutor::Execute(Runnable * pRunnable)
{
	if (!m_bEnableInsertTask)
	{
		return false;
	}
	if (NULL == pRunnable)
	{
		return false;
	}
	if (m_Tasks.size() >= m_maxPendingTasks)
	{
		if (m_ThreadPool.size() < m_maxThreads)
		{
			CWorker * pWorker = new CWorker(this, pRunnable);
			if (NULL == pWorker)
			{
				return false;
			}
			EnterCriticalSection(&m_csThreadPoolLock);
			m_ThreadPool.insert(pWorker);
			LeaveCriticalSection(&m_csThreadPoolLock);
			pWorker->Start();
		}
		else
		{
			return false;
		}
	}
	else
	{
		EnterCriticalSection(&m_csTasksLock);
		m_Tasks.push_back(pRunnable);
		LeaveCriticalSection(&m_csTasksLock);
	}
	return true;
}