关于c# timer的问题

pigjiang 2009-08-31 11:47:00
我需要等待来自并口的一个高电平,用了一个while循环。然后如果十秒钟内这个电平还不来的话,就取消等待。但是,我把while循环加上以后,Timer就进不了Tick了,去掉那个等待的话,可以进Tick。请问是怎么回事呢?

.......初始化
while (d == 0)//这里等待并口信号
{
WinIO.GetPortVal((IntPtr)0x378, out d, 1);
}
}

private void timer1_Tick(object sender, EventArgs e)
{
int temp = Convert.ToInt32(lb_TimeCounter.Text);
temp = temp - 1;
lb_TimeCounter.Text = Convert.ToString(temp);
lb_TimeCounter.Refresh();
if (temp == 0)
this.Close();
}
...全文
222 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjp1234airen4385 2009-09-01
  • 打赏
  • 举报
回复
8楼不是抄7楼的。
是8楼打开的帖子,有事耽搁了,等回来的时候,直接回帖。
没有想到和7楼的答案一样。
绝对的巧合。
wh_wangjun 2009-08-31
  • 打赏
  • 举报
回复
boolean stop;//全局变量

.......初始化
stop = false;

while (d == 0 )//这里等待并口信号
{
WinIO.GetPortVal((IntPtr)0x378, out d, 1);
Application.DoEvents();
if (stop==true) break;
}
}

private void timer1_Tick(object sender, EventArgs e)
{
int temp = Convert.ToInt32(lb_TimeCounter.Text);
temp = temp - 1;
lb_TimeCounter.Text = Convert.ToString(temp);
lb_TimeCounter.Refresh();
if (temp == 0)
Stop = true;
}

mjp1234airen4385 2009-08-31
  • 打赏
  • 举报
回复
while (d == 0)//这里等待并口信号
{
WinIO.GetPortVal((IntPtr)0x378, out d, 1);
Application.DoEnvent();
}
qldsrx 2009-08-31
  • 打赏
  • 举报
回复
如果我没有理解错你的意思的话,你把这段改为这样就应该可以好了,其它不变:

while (d == 0)//这里等待并口信号
{
WinIO.GetPortVal((IntPtr)0x378, out d, 1);
Application.DoEvents();
}
dancingbit 2009-08-31
  • 打赏
  • 举报
回复
while循环的时候,整个线程就停在这儿了,其他的消息都无法被处理。
pigjiang 2009-08-31
  • 打赏
  • 举报
回复
根据2楼的建议,把代码改成下面这样,问题解决了,但是就是想不明白,Timer的这个Tick中断,是不是还有优先级问题呢?难道系统为了保证While循环的可靠性,自动把Timer给屏蔽了?

DateTime DT = DateTime.Now;
while ((d&0xFF) == 0xFF)//等待触发信号
{
WinIO.GetPortVal((IntPtr)0x378, out d, 1);
TimeDiff = DateTime.Now - DT;
lb_TimeCounter.Text = Convert.ToString(10-TimeDiff.Seconds);
lb_TimeCounter.Refresh();
if (TimeDiff.Seconds == 10) break;
}
this.Close();
pigjiang 2009-08-31
  • 打赏
  • 举报
回复
我在Timer_Tick里加入一个断点,当我的程序里加入While循环以后,就不在这个断点处中断了。
lxxlql 2009-08-31
  • 打赏
  • 举报
回复
对比调试
pigjiang 2009-08-31
  • 打赏
  • 举报
回复
谢谢楼上,这个也是个思路。
但是我原先的想法怎么就实现不了呢。加上while循环,就不进Tick了。
dancingbit 2009-08-31
  • 打赏
  • 举报
回复
在循环中取时间DateTime.Now,与循环开始前的时间比较,时间到了就跳出。
dancingbit 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 pigjiang 的回复:]
#8楼所言极是。一看就明白,谢谢!
[/Quote]
8楼只不过是抄了7楼的,嘿嘿,居然还能得到这样的评价...
pigjiang 2009-08-31
  • 打赏
  • 举报
回复
#8楼所言极是。一看就明白,谢谢!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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