学习线程编了一个试验程序:
在程序启动后调用_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都没有反映,想请教一下为什么会出现这种情况。

解决方案 »

  1.   

    有试过跟踪dwRetCondition的值,观察线程的情况吗
      

  2.   

    你在哪里改变dwRetCondition的值?
      

  3.   

    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);
    }
                     ::InterlockedIncrement((int*)&dwRetCondition );
    }
      

  4.   

    楼主死机的原因可能是while执行的太猛了,这段代码有非常严重,可以说是致命的性能问题。
    实现此类功能应该用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;
    }
    }
      

  5.   

    谢谢楼上的指导,不知用Event如何实现?