c#计时器不工作啊。

mjzhanghu 2017-08-12 12:02:29
按钮触发 loopSend查找联系人列表循环发送信息,发送前判断 com_bz为false。 这个标示位是每次ComWrite后至真,同时启动计时器,当计时器到设定时间2000后 com_bz至false。
可是测试发现ComWrite时并没有间隔。 每条发送只有几十毫秒。每次执行for循环前com_bz都是false。 新人初学,求教。



private void ComWrite(string num, string message)//写入串口
{
if (serialPort1.IsOpen)
{

serialPort1.Write(num + message);
LoopSendDelegate listboxView2_ =(x,y) => {
listBox2.Items.Add(x + y);
};//委托执行,显示发送报文
BeginInvoke(listboxView2_, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:fff")+" => "+ num, message);
com_bz = true;//标志位至1
timer2.Start();//开始计时
serialPort1.DiscardOutBuffer();//发送后丢弃缓存区数据
}
}


void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
this.timer2.Stop();
com_bz = false ;
}

private void loopSend(object message)//发送消息
{
DataTable dt = db.sqlselect("select* from 联系人 ","联系人").Tables[0];
LoopSendDelegate send_ = new LoopSendDelegate(ComWrite);
for (int i = 0; i <= dt.Rows.Count - 1 && !com_bz ; i++)
{
BeginInvoke(send_, new object[] { dt.Rows[i][0].ToString(), message });

}
}
...全文
261 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2017-08-12
  • 打赏
  • 举报
回复
假如lz的需求是从数据库读取数据,每隔2秒显示出来,可以这样处理: 从数据库读取数据,一次性放进队列Queue里(用你的for循环),然后启动timer,在void timer2_Elapsed里面显示数据,即让队列出队,将队首元素head显示出来,同时head也从队列中删除了 你的问题,似乎不需要begininvoke
秋的红果实 2017-08-12
  • 打赏
  • 举报
回复
for (int i = 0; i <= dt.Rows.Count - 1 && !com_bz ; i++) { BeginInvoke(send_, new object[] { dt.Rows[i][0].ToString(), message }); } ==> for循环前com_bz是false,那么循环过程中基本一直是false,因为:完成这个for循环也就毫秒级时间,远小于你预想的2秒,除非你的datatable有大量数据;在这个过程中,BeginInvoke异步出多个次线程在同时执行,而且没有次序,这样控制com_bz的值是混乱的
exception92 2017-08-12
  • 打赏
  • 举报
回复
引用 4 楼 mjzhanghu 的回复:
[quote=引用 2 楼 duanzi_peng 的回复:] 发送前判断 com_bz为false。 -》代码哪里有判断,只有赋值。 每条发送只有几十毫秒。每次执行for循环前com_bz都是false。 -》for循环过程中 timer2 一直start ,无法通过com_bz 来标识timer2 事件是否重新启动。 你想异步让它每隔2秒 发送一次数据就必须处理好com_bz 标识的值。
谢版主回答。for循环里有判断 com_bz,为true了才执行。 另外在timer事件里面就让他stop了。 怎么改简单呢,用同步行不行?[/quote] 不能在for循环里去控制timer, 这样timer会一直start,直到for 循环结束。 应该在 timer2_Elapsed 中的去获取dt中的数据写入串口。
mjzhanghu 2017-08-12
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
发送前判断 com_bz为false。 -》代码哪里有判断,只有赋值。 每条发送只有几十毫秒。每次执行for循环前com_bz都是false。 -》for循环过程中 timer2 一直start ,无法通过com_bz 来标识timer2 事件是否重新启动。 你想异步让它每隔2秒 发送一次数据就必须处理好com_bz 标识的值。
谢版主回答。for循环里有判断 com_bz,为true了才执行。 另外在timer事件里面就让他stop了。 怎么改简单呢,用同步行不行?
mjzhanghu 2017-08-12
  • 打赏
  • 举报
回复
引用 1 楼 yuankaiwsl 的回复:
发送串口数据和timer是在一个线程里,执行完发送串口数据才执行timer.Enable=true,所以说,1、一直没想串口发送数据,2、timer没用处
串口发送是 loopSend 执行的啊,是可以发出去的。"timer没用处"没理解。
exception92 2017-08-12
  • 打赏
  • 举报
回复
发送前判断 com_bz为false。 -》代码哪里有判断,只有赋值。 每条发送只有几十毫秒。每次执行for循环前com_bz都是false。 -》for循环过程中 timer2 一直start ,无法通过com_bz 来标识timer2 事件是否重新启动。 你想异步让它每隔2秒 发送一次数据就必须处理好com_bz 标识的值。
巴士上的邂逅 2017-08-12
  • 打赏
  • 举报
回复
发送串口数据和timer是在一个线程里,执行完发送串口数据才执行timer.Enable=true,所以说,1、一直没想串口发送数据,2、timer没用处

110,533

社区成员

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

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

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