总感觉不舒服,这个多线程,什么东西都需要自己控制。
以前也没有怎么接触过多线程这个东西,没什么经验,大家看看还有没有其他什么想法。
大概想法就是在i=2500或者i=5000或者i=7500的实现线程休眠 500微秒,然后可以把时间片分给其他线程。
大家看输出,可以看出来,基本上是这样的。
/* From src/thrdutil */
void IThread_Sleep(IThread *me,IShell *piShell, int nMS)
{
AEECallback *pcb = ITHREAD_GetResumeCBK(me);
ISHELL_SetTimerEx(piShell,nMS,pcb);
ITHREAD_Suspend(me);
}
/*
* pIThread1的回调
*/
void Cbk_Runnable1(IThread * pIThread, void *po)
{
int i;
TestFor * pMe = (TestFor *)po;
if(NULL != pIThread)
{
DBGPRINTF("thread 1 started");
for (i=0; i<10000; i++)
{
if ((2500 == i) || (5000 == i) || (7500 == i))
{
IThread_Sleep(pIThread, pMe->pIShell, 500);
}
DBGPRINTF("Thread 1 Count = %d",i);
}
} else
{
DBGPRINTF("Thread 1 start fail");
}
}
/*
* pIThread2的回调
*/
void Cbk_Runnable2(IThread * pIThread, void *po)
{
int i;
TestFor * pMe = (TestFor *)po;
if(NULL != pIThread)
{
DBGPRINTF("thread 2 started");
for (i=0; i<10000; i++)
{
if ((2500 == i) || (5000 == i) || (7500 == i))
{
IThread_Sleep(pIThread, pMe->pIShell, 500);
}
DBGPRINTF("Thread 2 Count = %d",i);
}
} else
{
DBGPRINTF("Thread 2 start fail");
}
}
/*
* pIThread3的回调
*/
void Cbk_Runnable3(IThread * pIThread, void *po)
{
int i;
TestFor * pMe = (TestFor *)po;
if(NULL != pIThread)
{
DBGPRINTF("thread started3");
for (i=0; i<10000; i++)
{
if ((2500 == i) || (5000 == i) || (7500 == i))
{
IThread_Sleep(pIThread, pMe->pIShell, 500);
}
DBGPRINTF("Thread 3 Count = %d",i);
}
} else
{
DBGPRINTF("Thread 3 start fail");
}
}
XXX_HandleEvent中添加的部分
case EVT_APP_START:
// Add your code here...
{
int nRtr;
nRtr = ISHELL_CreateInstance(pMe->pIShell, AEECLSID_THREAD,
(void **)&pMe->pIThread1);
if (SUCCESS != nRtr)
return FALSE;
nRtr = ISHELL_CreateInstance(pMe->pIShell, AEECLSID_THREAD,
(void **)&pMe->pIThread2);
if (SUCCESS != nRtr)
return FALSE;
nRtr = ISHELL_CreateInstance(pMe->pIShell, AEECLSID_THREAD,
(void **)&pMe->pIThread3);
if (SUCCESS != nRtr)
return FALSE;
nRtr = ITHREAD_Start(pMe->pIThread1, 100,
(PFNTHREAD)Cbk_Runnable1, (void *)pMe);
nRtr = ITHREAD_Start(pMe->pIThread2, 100,
(PFNTHREAD)Cbk_Runnable2, (void *)pMe);
nRtr = ITHREAD_Start(pMe->pIThread3, 100,
(PFNTHREAD)Cbk_Runnable3, (void *)pMe);
}
return(TRUE);