学习线程编了一个试验程序:
在程序启动后调用_beginthread( _Idle_Main, 0, NULL );
在程序void _Idle_Main( LPVOID pDummy )
{
while(TRUE)
{
if(dwRetCondition == WAIT_IDLE)
{
/*打开CD ROM*/
mciSendString("Set cdAudio door open wait",NULL,0,NULL);
}
else if(dwRetCondition == WAIT_BUSY)
{
/*关闭CD ROM*/
mciSendString("Set cdAudio door closed wait",NULL,0,NULL);
}
}
}中希望能够实现一个监控程序,根据dwRetCondition值的改变开关CD ROM。
但是启动线程后只是在第一次改变dwRetCondition时有效,后来无论怎么改变dwRetCondition都没有反映,想请教一下为什么会出现这种情况。
在程序启动后调用_beginthread( _Idle_Main, 0, NULL );
在程序void _Idle_Main( LPVOID pDummy )
{
while(TRUE)
{
if(dwRetCondition == WAIT_IDLE)
{
/*打开CD ROM*/
mciSendString("Set cdAudio door open wait",NULL,0,NULL);
}
else if(dwRetCondition == WAIT_BUSY)
{
/*关闭CD ROM*/
mciSendString("Set cdAudio door closed wait",NULL,0,NULL);
}
}
}中希望能够实现一个监控程序,根据dwRetCondition值的改变开关CD ROM。
但是启动线程后只是在第一次改变dwRetCondition时有效,后来无论怎么改变dwRetCondition都没有反映,想请教一下为什么会出现这种情况。
{
if(dwRetCondition == WAIT_IDLE)
{
/*打开CD ROM*/
mciSendString("Set cdAudio door open wait",NULL,0,NULL);
}
else if(dwRetCondition == WAIT_BUSY)
{
/*关闭CD ROM*/
mciSendString("Set cdAudio door closed wait",NULL,0,NULL);
}
::InterlockedIncrement((int*)&dwRetCondition );
}
实现此类功能应该用Event。但鉴于楼主初学线程,请暂可用下面的代码一试void _Idle_Main( LPVOID pDummy )
{
while(TRUE)
{
static DWORD dwLastRet = (DWORD)-1;
if ( dwLastRet == dwRetCondition )
{
Sleep(10);
}
MessageBox( NULL, _T("State changed"), _T("info"), MB_OK );
if(dwRetCondition == WAIT_IDLE)
{
/*打开CD ROM*/
mciSendString("Set cdAudio door open wait",NULL,0,NULL);
}
else if(dwRetCondition == WAIT_BUSY)
{
/*关闭CD ROM*/
mciSendString("Set cdAudio door closed wait",NULL,0,NULL);
}
dwLastRet = dwRetCondition;
}
}