winform 多个计时器操作问题

luqing200862 2011-10-20 01:13:06
目的:通过modbus TCP/IP 协议访问服务器端

过程:现在有2个计时器,分别传不同的指令,向服务器请求,如下代码:

请求
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
c.send("09 20 00 0A", "03");//发送请求指令
ReciveData1();

private void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
c.send("09 34 00 0A", "03");//发送请求指令
ReciveData2();
}

接收:
//从线程池接受响应数据(读T1-T10:Actual)
private void ReciveData1()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(LongTask1));
}
//从线程池接受响应数据(读T1-T10:Setpoint)
private void ReciveData2()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(LongTask2));
}
public void LongTask1(object obj)
{
string[] strReceive = new string[10];

strReceive = c.receive();

this.label65.Text = strReceive[0];
this.label64.Text = strReceive[1];
this.label63.Text = strReceive[2];
this.label62.Text = strReceive[3];
this.label61.Text = strReceive[4];
this.label60.Text = strReceive[5];
this.label59.Text = strReceive[6];
this.label58.Text = strReceive[7];
this.label57.Text = strReceive[8];
this.label56.Text = strReceive[9];
}
public void LongTask2(object obj)
{
string[] strReceive = new string[10];

strReceive = c.receive();

this.label53.Text = strReceive[0];
this.label52.Text = strReceive[1];
this.label51.Text = strReceive[2];
this.label50.Text = strReceive[3];
this.label49.Text = strReceive[4];
this.label48.Text = strReceive[5];
this.label47.Text = strReceive[6];
this.label46.Text = strReceive[7];
this.label45.Text = strReceive[8];
this.label44.Text = strReceive[9];
}

问题:如何通过队列,或者锁,对他们响应的数据进行异步处理。
现在的结果是响应回来的数据,不能异步显示,会产生交叉显示。
如: this.label65.Text =60,......
this.label53.Text =50,......
会出现这样的结果:
this.label65.Text =50,......
this.label53.Text =60,......
...全文
307 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
luqing200862 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 q512007445 的回复:]

用一个计时器:
//启动时钟,发送数据
System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
timer1.Tick += new EventHandler(timer1_Elapsed);
//timer1.Elapse……
[/Quote]

已解决,3q
q512007445 2011-10-24
  • 打赏
  • 举报
回复
用一个计时器:
//启动时钟,发送数据
System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
timer1.Tick += new EventHandler(timer1_Elapsed);
//timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
timer1.Interval = 1000;//毫秒

timer1.Enabled = true;


private void timer1_Elapsed(object sender, EventArgs e)
{
//lock (this)
//{
// c.send("09 20 00 0A", "03");//发送请求指令 (读T1-T10:Actual)
// ReciveData1();
// Thread.Sleep(1000);
//}
lock (this)
{
c.send("09 20 00 0A", "03");//发送请求指令 (读T1-T10:Actual)
LongTask1();
c.send("09 34 00 0A", "03");//发送请求指令 (读T1-T10:Setpoint)
LongTask2();
c.send("09 48 00 0A", "03");//发送请求指令 (读1B-10B:Actual)
LongTask3();
c.send("09 5C 00 0A", "03");//发送请求指令 (读B1-B10:Setpoint)
LongTask4();

}

}
luqing200862 2011-10-20
  • 打赏
  • 举报
回复
已用简单方法解决了下,,,,能达到我的要求,殊不知:稳定否?

//定时发送请求(读T1-T10:Actual)
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
lock (this)
{
c.send("09 20 00 0A", "03");//发送请求指令
ReciveData1();
}

}
private void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
lock (this)
{
c.send("09 34 00 0A", "03");//发送请求指令
ReciveData2();
}
}
ruanwei1987 2011-10-20
  • 打赏
  • 举报
回复
mark 帮顶

110,533

社区成员

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

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

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