WaitForSingleObject()调用死机

zjhzzyf 2009-05-06 05:51:11

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整个界面就陷入死机装态,不能动。
有没什么方法可以解决?
...全文
361 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-05-07
  • 打赏
  • 举报
回复
这个事件是由驱动程序设置吗?是在用户线程还是系统线程中设置?还有由谁了reset?
zjhzzyf 2009-05-07
  • 打赏
  • 举报
回复
5楼的,能不能再具体的说下你的做法?我对线程不懂的,只是有点概念。
zjhzzyf 2009-05-07
  • 打赏
  • 举报
回复
hEvent是中断事件,1S钟才生中断,然后通过PCI总线对硬件红绿灯写数据并且修改界上的红绿灯,就是实现软件和硬件的同步。
hEvent在OnInitDialog中和驱关联了。
cnzdgs 2009-05-07
  • 打赏
  • 举报
回复
说说你使用事件的目的是什么。
zjhzzyf 2009-05-06
  • 打赏
  • 举报
回复
我在网上看到说:MsgWaitForMultipleObjects是用来在GUI现成中等待对象被激发,是用来修改主消息循环的
这个是不能解决我的问题?
biweilun 2009-05-06
  • 打赏
  • 举报
回复
创建一个线程,专门用来监视UI线程。在其中WaitForSingleObject,这样就不会影响主线程了。
用CreateThread创建线程不用我再说了吧?
zjhzzyf 2009-05-06
  • 打赏
  • 举报
回复
原理是懂了,但具体不知道怎么实现呢?
biweilun 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wutaihua 的回复:]
当然会死机了,你在主线程里进行事件的等待,会当主线程在事件未触发前挂起线程。而挂起的线程就是主线程。
[/Quote]
这句说得好嘛
wutaihua 2009-05-06
  • 打赏
  • 举报
回复
当然会死机了,你在主线程里进行事件的等待,会当主线程在事件未触发前挂起线程。而挂起的线程就是主线程。

主线程负责用户的交互,如果主线程死了,界面当然就刷新不了了。

你应该重新建立一个线程来做这些时间,而主线程主要来监督这些线程,最主要的就是随时响应用户的界面操作,而非去做任务。
zjhzzyf 2009-05-06
  • 打赏
  • 举报
回复
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);
}

}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧