BOOL CBypassQueue::BatchWorker(BITEM *pItem)
{
    int         nMaxWorker = MIN(GetMaxWorker(), 10);
    BOOL        bOk = FALSE;

    if(GetActiveWorker() < nMaxWorker)
    {
        if(StartWorker(WorkerJob, (void *)pItem))
        {
            bOk = TRUE;
        }    
    }

    return bOk;
}
int
Client::OnRun()
{
    int i;
    switch(m_sendType)
    {
        case STRESS_TEST:
            switch(m_workMode)
            {
                case THREADS:
                    for (i = 0; i < m_stressWorkers; i++) {
                        if (m_message.empty())
                            StartWorker(THREADS);
                        else
                            StartWorker(THREADS, m_message);
                    }
                    break;
                case EVENTS:
                    for (i = 0; i < m_stressWorkers; i++) {
                        if (m_message.empty())
                            StartWorker(EVENTS);
                        else
                            StartWorker(EVENTS, m_message);
                    }
                    break;
                default:
                    for (i = 0; i < m_stressWorkers; i++) {
                        if (m_message.empty())
                            StartWorker(i % 5 == 0 ? THREADS : EVENTS);
                        else
                            StartWorker(i % 5 == 0 ? THREADS : EVENTS, m_message);
                    }
                break;
            }
        break;
        case SEND_MESSAGE:
            StartWorker(m_workMode,m_message);
        break;
        case SEND_RANDOM:
            StartWorker(m_workMode);
        break;
    }
    mTimer.Start(timeout_val,true);
    return wxApp::OnRun();
}
void CMeterReader::MeterReaderWorker()
{
	int			nIndex;
    int         nState;
	long		sleeptime=1000000;
	long		magic=1;
    
    METERITEM * pItem;
    METERINGJOB	 *pJob = NULL;

    nState = codiGetState(GetCoordinator());
    if (nState != CODISTATE_NORMAL)
	{
        XDEBUG("METERING: Coordinator is not ready\r\n");
        return;
    }

	while(TRUE)
	{
		usleep(sleeptime/magic); magic = 1;

		m_Locker.Lock();
       	pItem = m_List.GetHead();
   		if (pItem) m_List.RemoveAt((POSITION)pItem->nPosition);
		m_Locker.Unlock();

		if (pItem == NULL)
			break;

		magic = 10;

		for(;(GetActiveWorker() > 0) || (pItem != NULL);)
		{
			if ((GetActiveWorker() < m_nMeteringThreadCount) && (pItem != NULL))
			{
				nIndex = GetActiveWorker();
				if (nIndex != -1)
				{
					pJob = (METERINGJOB *)MALLOC(sizeof(METERINGJOB));
					if (pJob != NULL)
					{
						memset(pJob, 0, sizeof(METERINGJOB));
    	        		memcpy(&pJob->id, &pItem->id, sizeof(EUI64));
       	  		   		pJob->nOption = pItem->nOption;
       	    	 		pJob->nOffset = pItem->nOffset;
            			pJob->nCount  = pItem->nCount;
						FREE(pItem);

					    if (StartWorker(WorkerJob, (void *)pJob))
						{

						    m_Locker.Lock();
        				    pItem = m_List.GetHead();
       					    if (pItem) m_List.RemoveAt((POSITION)pItem->nPosition);
						    m_Locker.Unlock();
						}
                    }
				}
			}

            usleep(100000);
		}
	}
}