void CTraffic_lightDlg::OnOK() 
{

UpdateData(TRUE);  //读取数码管内容
m_hy=m_hz=m_zs=m_zx=m_zt;
if (m_hl>=m_zt || m_zl>=m_zt)
{
AfxMessageBox("由于输入的时间错误,程序将终止");
CDialog::OnCancel();
//CTraffic_lightDlg::OnInitDialog();

}
UpdateData(FALSE);  //显示数码管内容

n_zt=m_zt;
LedShow(0);//横红纵绿
//SetTimer(1,1,NULL);
MapShow0();

while(WAIT_OBJECT_0==WaitForSingleObject(hEvent,1000)) 
   {

char t[256];
CString s;
n_zt-=1;
n_s=n_zt/10;
n_g=n_zt%10;
LightTen(n_s);
LightBit(n_g);
//Sleep(1000);

if(n_zt==-1)
{
if(l_b==0)
{
l_b=2;
LedShow(1);//横绿纵红
MapShow1();//SetTimer(2,1,NULL);//MapShow2();
}
else
{
l_b=0;
LedShow(0);//横红纵绿
MapShow0();//SetTimer(1,1,NULL);//MapShow0();

}
n_zt=m_zt;
}
if(n_zt==m_zl)
{
if (l_b==0)
{
MapShow3();//SetTimer(4,1,NULL);//MapShow3();
LedShow(3);//横红纵黄

}

}

if ( n_zt==m_hl) 
{

if (l_b==2)
{
MapShow2();//SetTimer(3,1,NULL);//MapShow1();
LedShow(2);//横黄纵红

}
}

sprintf(t,"%d",n_zt);
s=t;
GetDlgItem(IDC_EDIT1)->SetWindowText(s); 
GetDlgItem(IDC_EDIT2)->SetWindowText(s);
GetDlgItem(IDC_EDIT3)->SetWindowText(s);
GetDlgItem(IDC_EDIT4)->SetWindowText(s);
}

}
我已在OnInitDialog中定义了hEvent,并关连了事件。
我这个是用中断定时,问题就出现在while的WaitForSingleObject()里,如果使用软件定时,while里的代码全都能实现的。
但用WaitForSingleObject整个界面就陷入死机装态,不能动。
有没什么方法可以解决?

解决方案 »

  1.   

    void CTraffic_lightDlg::OnOK() 
    {

    UpdateData(TRUE);  //读取数码管内容
    m_hy=m_hz=m_zs=m_zx=m_zt;
    if (m_hl>=m_zt || m_zl>=m_zt)
    {
    AfxMessageBox("由于输入的时间错误,程序将终止");
    CDialog::OnCancel();
    //CTraffic_lightDlg::OnInitDialog();

    }
    UpdateData(FALSE);  //显示数码管内容

    n_zt=m_zt;
    LedShow(0);//横红纵绿
    //SetTimer(1,1,NULL);
    MapShow0();

    while(WAIT_OBJECT_0==WaitForSingleObject(hEvent,1000)) 
       {

    char t[256];
    CString s;
    n_zt-=1;
    n_s=n_zt/10;
    n_g=n_zt%10;
    LightTen(n_s);
    LightBit(n_g);
    //Sleep(1000);

    if(n_zt==-1)
    {
    if(l_b==0)
    {
    l_b=2;
    LedShow(1);//横绿纵红
    MapShow1();//SetTimer(2,1,NULL);//MapShow2();
    }
    else
    {
    l_b=0;
    LedShow(0);//横红纵绿
    MapShow0();//SetTimer(1,1,NULL);//MapShow0();

    }
    n_zt=m_zt;
    }
    if(n_zt==m_zl)
    {
    if (l_b==0)
    {
    MapShow3();//SetTimer(4,1,NULL);//MapShow3();
    LedShow(3);//横红纵黄

    }

    }

    if ( n_zt==m_hl) 
    {

    if (l_b==2)
    {
    MapShow2();//SetTimer(3,1,NULL);//MapShow1();
    LedShow(2);//横黄纵红

    }
    }

    sprintf(t,"%d",n_zt);
    s=t;
    GetDlgItem(IDC_EDIT1)->SetWindowText(s); 
    GetDlgItem(IDC_EDIT2)->SetWindowText(s);
    GetDlgItem(IDC_EDIT3)->SetWindowText(s);
    GetDlgItem(IDC_EDIT4)->SetWindowText(s);
    }

    }
      

  2.   

    创建一个线程,专门用来监视UI线程。在其中WaitForSingleObject,这样就不会影响主线程了。
    用CreateThread创建线程不用我再说了吧?
      

  3.   

    我在网上看到说:MsgWaitForMultipleObjects是用来在GUI现成中等待对象被激发,是用来修改主消息循环的 
    这个是不能解决我的问题?
      

  4.   

    hEvent是中断事件,1S钟才生中断,然后通过PCI总线对硬件红绿灯写数据并且修改界上的红绿灯,就是实现软件和硬件的同步。
    hEvent在OnInitDialog中和驱关联了。
      

  5.   

    这个事件是由驱动程序设置吗?是在用户线程还是系统线程中设置?还有由谁了reset?