socket接受数据并实时绘图

ilovenili 2018-09-18 01:47:16
需要的功能:将客户端接受的数据实时送入chart控件显示动态波形
遇到的问题:
cahrt控件实时显示用的是timer_tick事件,由于是form的计时器是单线程的,只要开启了timer_tick,socket就自动断开连接
,没法实时传数据了。
我的大致思路:
1 开启socket,客户端每隔一秒会接收到一个数据,把它加入到点的list
2 Timer_tick读到上述list实时显示

大致代码如下:
客户端接收数据部分代码:
public void socketConnetion()
{
string stringData = "";
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
byte[] byteMessage;
if (!socket.Connected)
{
string ipAndPort = "192.168.1.129:8080";
IPAddress serverIp = IPAddress.Parse(ipAndPort.Split(':')[0]);
int serverPort = Convert.ToInt32(ipAndPort.Split(':')[1]);
IPEndPoint iep = new IPEndPoint(serverIp, serverPort);
socket.Connect(iep);
}
//string clo = textBox3.Text;

for (int i = 0; i <= 40; i++)//总共接受40个数据,每秒接受一个
{
List<byte> byteSource = new List<byte>();
double kk1 = 200;
double kk2 = 60;
byte[] by1 = BitConverter.GetBytes(kk1);

byteSource.AddRange(by1);

byte[] inputData = byteSource.ToArray();

socket.Send(inputData);
byteMessage = new byte[16];

int resv = socket.Receive(byteMessage);
//接受到的数据
double outputdata1 = BitConverter.ToDouble(splite1, 0);

//实时更新点的LIst
common.Var1 = outputdata1.ToString();
var argument = DateTime.Now;
SeriesPoint pp = new SeriesPoint(argument.ToString(), outputdata1.ToString());
common.Oo.Add(pp);

}
}
catch
{

}
finally
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}

Timer事件:
private void timer1_Tick(object sender, EventArgs e)
{
//将实时更新的list数组动态显示
var argument = DateTime.Now;
chartControl1.Series[0].Points.AddRange(new SeriesPoint(argument.ToString(), common.Oo.Array));
}


全局变量:
public static class common
{
private static List<SeriesPoint> oo;
public static List<SeriesPoint> Oo
{
get { return oo; }
set { oo = value; }
}
}
...全文
1046 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
LS 正解, LZ可以试试,实时绘图
  • 打赏
  • 举报
回复
引用 3 楼 ilovenili 的回复:
[quote=引用 1 楼 zy186311 的回复:]
收到传过来的消息之后直接刷新显示不行吗

怎么刷新?刷新chart图表?[/quote]
看一下14楼的回复
jndx_xyc 2018-09-22
  • 打赏
  • 举报
回复
我刚做过这样的类似的项目,先开线程用socket传送,然后invoke调用主线程绘制就可以了。
ilovenili 2018-09-22
  • 打赏
  • 举报
回复
引用 10 楼 xian_wwq 的回复:
[quote=引用 8 楼 ilovenili 的回复:]
[quote=引用 6 楼 xian_wwq 的回复:]
最好调整下思路,再说问题
1。数据接收和数据解析需要分离
否则解析超时,直接导致socket超时中断
2。多个线程操作公用数据,必须加锁实现同步,
否则就是各种怪数据
3。如果只是显示数据,根本不需要timer
接收数据-〉解析数据-〉显示数据,事件触发,


大牛哥批评的对,我的这个是把解析完的正确数据传给chart,数据测试过,应该没问题,你说的第三个问题,我现在可以实现把接受完的所有数据一次显示出来,但不能实时绘图,牛哥,有没有法子?[/quote]
chart显示数据建议使用数据绑定的方式来完成
这样数据变化都是对后台的数据源进行处理
看chart的帮助文档,
只要是实现了IEnumerable接口的数据类型,都可以绑定到图表控件中[/quote]重要的事情说三遍:实时绘图,实时绘图,实时绘图
ilovenili 2018-09-22
  • 打赏
  • 举报
回复
引用 7 楼 ilovenili 的回复:
[quote=引用 5 楼 jichao1010 的回复:]
[quote=引用 4 楼 ilovenili 的回复:]
[quote=引用 2 楼 jichao1010 的回复:]
Socket接收到数据负责写List<Point>, 而Timer定时器负责读List<Point>并显示,应该是这样的吧。


嗯,我想的是这样,但是timer_stick和socket不能同时运行,因此就不能实现一个写,一个读,现在能做到的
只有读完了以后再一次性显示,不能实时绘图[/quote]

socket的读写放到子线程里面,这样也就不会卡界面了。这样也不会同timer_stick相冲突。[/quote]

michael1014哥,这个子线程加在哪里,具体怎么定义?[/quote]重要的事情说三遍:实时绘图,实时绘图,实时绘图
ilovenili 2018-09-22
  • 打赏
  • 举报
回复
引用 10 楼 xian_wwq 的回复:
[quote=引用 8 楼 ilovenili 的回复:]
[quote=引用 6 楼 xian_wwq 的回复:]
最好调整下思路,再说问题
1。数据接收和数据解析需要分离
否则解析超时,直接导致socket超时中断
2。多个线程操作公用数据,必须加锁实现同步,
否则就是各种怪数据
3。如果只是显示数据,根本不需要timer
接收数据-〉解析数据-〉显示数据,事件触发,


大牛哥批评的对,我的这个是把解析完的正确数据传给chart,数据测试过,应该没问题,你说的第三个问题,我现在可以实现把接受完的所有数据一次显示出来,但不能实时绘图,牛哥,有没有法子?[/quote]
chart显示数据建议使用数据绑定的方式来完成
这样数据变化都是对后台的数据源进行处理
看chart的帮助文档,
只要是实现了IEnumerable接口的数据类型,都可以绑定到图表控件中[/quote]数据绑定已经实现了,不能实时显示啊,只能读完以后显示图形
xuzuning 2018-09-22
  • 打赏
  • 举报
回复
你的问题在于你自己把事情弄复杂了
chart 有 DataSource 属性,你可以把一个集合(比如 DataTable)绑定到它上面,这样数据源的变化就会直接反映到画面
至于数据是如何得到的,并不是主要的,你只要在数据到来时,把数据存放到集合中去就可以了
ilovenili 2018-09-20
  • 打赏
  • 举报
回复
引用 6 楼 xian_wwq 的回复:
最好调整下思路,再说问题
1。数据接收和数据解析需要分离
否则解析超时,直接导致socket超时中断
2。多个线程操作公用数据,必须加锁实现同步,
否则就是各种怪数据
3。如果只是显示数据,根本不需要timer
接收数据-〉解析数据-〉显示数据,事件触发,


大牛哥批评的对,我的这个是把解析完的正确数据传给chart,数据测试过,应该没问题,你说的第三个问题,我现在可以实现把接受完的所有数据一次显示出来,但不能实时绘图,牛哥,有没有法子?
ilovenili 2018-09-20
  • 打赏
  • 举报
回复
引用 5 楼 jichao1010 的回复:
[quote=引用 4 楼 ilovenili 的回复:]
[quote=引用 2 楼 jichao1010 的回复:]
Socket接收到数据负责写List<Point>, 而Timer定时器负责读List<Point>并显示,应该是这样的吧。


嗯,我想的是这样,但是timer_stick和socket不能同时运行,因此就不能实现一个写,一个读,现在能做到的
只有读完了以后再一次性显示,不能实时绘图[/quote]

socket的读写放到子线程里面,这样也就不会卡界面了。这样也不会同timer_stick相冲突。[/quote]

michael1014哥,这个子线程加在哪里,具体怎么定义?
xian_wwq 2018-09-20
  • 打赏
  • 举报
回复
引用 8 楼 ilovenili 的回复:
[quote=引用 6 楼 xian_wwq 的回复:]
最好调整下思路,再说问题
1。数据接收和数据解析需要分离
否则解析超时,直接导致socket超时中断
2。多个线程操作公用数据,必须加锁实现同步,
否则就是各种怪数据
3。如果只是显示数据,根本不需要timer
接收数据-〉解析数据-〉显示数据,事件触发,


大牛哥批评的对,我的这个是把解析完的正确数据传给chart,数据测试过,应该没问题,你说的第三个问题,我现在可以实现把接受完的所有数据一次显示出来,但不能实时绘图,牛哥,有没有法子?[/quote]
chart显示数据建议使用数据绑定的方式来完成
这样数据变化都是对后台的数据源进行处理
看chart的帮助文档,
只要是实现了IEnumerable接口的数据类型,都可以绑定到图表控件中
龍月 2018-09-20
  • 打赏
  • 举报
回复
引用 8 楼 ilovenili 的回复:
[quote=引用 6 楼 xian_wwq 的回复:]
最好调整下思路,再说问题
1。数据接收和数据解析需要分离
否则解析超时,直接导致socket超时中断
2。多个线程操作公用数据,必须加锁实现同步,
否则就是各种怪数据
3。如果只是显示数据,根本不需要timer
接收数据-〉解析数据-〉显示数据,事件触发,


大牛哥批评的对,我的这个是把解析完的正确数据传给chart,数据测试过,应该没问题,你说的第三个问题,我现在可以实现把接受完的所有数据一次显示出来,但不能实时绘图,牛哥,有没有法子?[/quote]
控件本身是如何刷新的。
xian_wwq 2018-09-19
  • 打赏
  • 举报
回复
最好调整下思路,再说问题
1。数据接收和数据解析需要分离
否则解析超时,直接导致socket超时中断
2。多个线程操作公用数据,必须加锁实现同步,
否则就是各种怪数据
3。如果只是显示数据,根本不需要timer
接收数据-〉解析数据-〉显示数据,事件触发,
苏克贝塔03 2018-09-19
  • 打赏
  • 举报
回复
引用 4 楼 ilovenili 的回复:
[quote=引用 2 楼 jichao1010 的回复:]
Socket接收到数据负责写List<Point>, 而Timer定时器负责读List<Point>并显示,应该是这样的吧。


嗯,我想的是这样,但是timer_stick和socket不能同时运行,因此就不能实现一个写,一个读,现在能做到的
只有读完了以后再一次性显示,不能实时绘图[/quote]

socket的读写放到子线程里面,这样也就不会卡界面了。这样也不会同timer_stick相冲突。
ilovenili 2018-09-18
  • 打赏
  • 举报
回复
引用 1 楼 zy186311 的回复:
收到传过来的消息之后直接刷新显示不行吗

怎么刷新?刷新chart图表?
ilovenili 2018-09-18
  • 打赏
  • 举报
回复
引用 2 楼 jichao1010 的回复:
Socket接收到数据负责写List<Point>, 而Timer定时器负责读List<Point>并显示,应该是这样的吧。


嗯,我想的是这样,但是timer_stick和socket不能同时运行,因此就不能实现一个写,一个读,现在能做到的
只有读完了以后再一次性显示,不能实时绘图
苏克贝塔03 2018-09-18
  • 打赏
  • 举报
回复
Socket接收到数据负责写List<Point>, 而Timer定时器负责读List<Point>并显示,应该是这样的吧。
  • 打赏
  • 举报
回复
收到传过来的消息之后直接刷新显示不行吗

111,093

社区成员

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

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

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