DatabindXY,集合已修改;可能无法执行枚举操作。

luoluowen 2012-03-14 10:29:22
List<float> datalist = new List<float>();
List<float> timelist = new List<float>();

public float[][] listArray = new float[128][];
public float[][] listFFT = new float[128][];
public float[][] listShock = new float[128][];
public float[][] ideal_line = new float[128][];


public int frames = 0; //listArray中行数,偶数行代表时间数据,奇数行代表加速度数据
public int curShowFrame = 0; //显示上下帧数据时的参数

private void server_start() //上位机作为服务器,接收下位机发来的数据包
{
while (true)
{
try
{
int port = 2001; //监听2001端口
string host = "127.0.0.1"; //本机回发的Ip
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
//this.label12.Text = this.label12.Text + "绑定2001端口并开始监听.....\n";
s.Bind(ipe); //绑定2001端口
s.Listen(0); //开始监听
//this.label12.Text = this.label12.Text + "等待客户发送请求......\n";

Socket temp = s.Accept(); //为新建连接创建新的Socket。
// this.label12.Text = this.label12.Text + "获得一个客户端,开始接收数据......\n";
byte[] bytes = new byte[1200];


int bytesint;
bytesint = temp.Receive(bytes, bytes.Length, 0);//从客户端接受信息
int n = 0;
Byte[] changebytes = new byte[4]; //暂存四个字节数据
for (int j = 0; j < 4 * 2 * 128; j++)
{
if (n == 4)
{

//Array.Reverse(changebytes);
if (j <= 2 * 2 * 128)
datalist.Add(BitConverter.ToSingle(changebytes, 0)); //存储加速度序列
else
timelist.Add(BitConverter.ToSingle(changebytes, 0));
n = 0;
j = j - 1;
}
else if (j == 4 * 2 * 128 - 1)
{

changebytes[n++] = bytes[j];
timelist.Add(BitConverter.ToSingle(changebytes, 0));//存储时间序列

}
else
changebytes[n++] = bytes[j];

}

frames = frames + 2;
curShowFrame = frames;
listArray[frames - 2] = new float[128];
listArray[frames - 1] = new float[128];

for (int k = 0; k < 128; k++)
{
listArray[frames - 2][k] = timelist[k]; //存入交叉数组中,偶数行为时间值,奇数行为加速度值
listArray[frames - 1][k] = datalist[k];
}
timelist.RemoveRange(0, 128); //清空数据
datalist.RemoveRange(0, 128);

#region 时域显示


if (mainPP.auto_position == "峰值匹配")
{
float tolerance_max = 0.0f;
float tolerance_min = 0.0f;

tolerance_max = Convert.ToSingle(0.2 * mainPP.amplitude);
tolerance_min = Convert.ToSingle(-0.2 * mainPP.amplitude);

ideal_line[frames-2] = new float[128];
ideal_line[frames-1] = new float[128];

for (int i = 0; i < 128; i++)
{

ideal_line[frames-2][i] = Convert.ToSingle(mainPP.amplitude * Math.Sin(i * Math.PI / 128)) + tolerance_max;
ideal_line[frames-1][i] = Convert.ToSingle(mainPP.amplitude * Math.Sin(i * Math.PI / 128)) + tolerance_min;
}
chart1.ChartAreas[0].AxisY.Minimum = -5;
chart1.Series["ShowLine"].Points.DataBindXY(listArray[frames - 2], listArray[frames - 1]);
chart1.Series["正理想脉宽"].Points.DataBindXY(listArray[frames - 2], ideal_line[frames-2]);
chart1.Series["负理想脉宽"].Points.DataBindXY(listArray[frames - 2], ideal_line[frames-1]);
chart1.Series["正理想脉宽"].IsXValueIndexed = true;
chart1.Series["负理想脉宽"].IsXValueIndexed = true;
chart1.Series["ShowLine"].IsXValueIndexed = true;

chart1.Update();


}

#endregion


string sendStr = "确认";
byte[] bs2 = Encoding.UTF8.GetBytes(sendStr);
temp.Send(bs2, bs2.Length, 0); //返回客户端成功信息

temp.Close();
s.Close();

}


catch (ArgumentNullException e0)
{
MessageBox.Show(e0.ToString());
}
catch (SocketException e2)
{
MessageBox.Show(e2.ToString());
}



}
}


目的是用mschart产生3条曲线,正理想脉宽,负理想脉宽,ShowLine。ShowLine是通过socket接收过来的数据,listArray,ideal_line通过DatabindXY绑定在chart中,第一次接收数据能显示曲线,但是第二次接收数据后却报错,错误为“集合已修改;可能无法执行枚举操作。”;该错误在单步运行时却不会发生,很莫名其妙,希望懂的人帮我解决些,万分感激!
...全文
531 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoluowen 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 stonespace 的回复:]

估计是Update方法内部有foreach,你把数组绑定到listArray等绑定到chart1里,然后Update里可能用foreach访问listArray等数组,listArray等数组可能在其他线程被增加或者减少元素,导致foreach异常,

你可以做个实验:chart1不直接绑定listArray等数组,而是在绑定之前把listArray等复制一份到另一个临时数组,然后绑定临时数……
[/Quote]
问题还是 没有解决,不过还是非常谢谢大家,我再想想别的办法。。。
luoluowen 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jshi123 的回复:]

server_start你是在新的线程里执行的吗?如果是注意后台线程更新界面要用Control.Invoke或BeginInvoke。
Socket每次循环都新建一个不合理,也没有看到你调用Close/Dispose,可能会造成资源无法及时释放,应该改成只用建立一个Socket就够了。
[/Quote]
是新建的线程,后面有s.close()和temp.close()啊,好像不是这个问题,因为我如果只绑定一个ShowLine,无论发多少次都没问题,但是我再绑定其他的让他显示就报错,所有应该是绑定的问题。。。纠结啊。。。大哥,你帮我想想办法,急死了
jshi123 2012-03-15
  • 打赏
  • 举报
回复
server_start你是在新的线程里执行的吗?如果是注意后台线程更新界面要用Control.Invoke或BeginInvoke。
Socket每次循环都新建一个不合理,也没有看到你调用Close/Dispose,可能会造成资源无法及时释放,应该改成只用建立一个Socket就够了。
luoluowen 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 stonespace 的回复:]

这个错误一般是foreach循环才会有的,但看了你的代码没发现foreach,异常是哪一行出现的?异常应该可以定位,
[/Quote]
异常出现在chart1.update();
luoluowen 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jshi123 的回复:]

试试接收到新的连接请求后清除上次画的曲线,在Accept()后面添加:
Socket temp = s.Accept();
chart1.Series["ShowLine"].Points.Clear();
chart1.Series["正理想脉宽"].Points.Clear();
chart1.Series["负理想脉宽"].Points.Clear();
[/Quote]
好像有点用,但是错误改成了:
问题事件名称: APPCRASH
应用程序名: 冲击测试控制系统.vshost.exe
应用程序版本: 9.0.21022.8
应用程序时间戳: 47316898
故障模块名称: KERNELBASE.dll
故障模块版本: 6.1.7600.16850
故障模块时间戳: 4e21132b
异常代码: e0434f4d
异常偏移: 00009673
OS 版本: 6.1.7600.2.0.0.256.1
区域设置 ID: 2052
其他信息 1: 0a9e
其他信息 2: 0a9e372d3b4ad19135b953a78882e789
其他信息 3: 0a9e
其他信息 4: 0a9e372d3b4ad19135b953a78882e789
PaulyJiang 2012-03-15
  • 打赏
  • 举报
回复
第二次以后每次接受新的数据源的时候给数据源先赋值一个NULL 试试
stonespace 2012-03-15
  • 打赏
  • 举报
回复
这个错误一般是foreach循环才会有的,但看了你的代码没发现foreach,异常是哪一行出现的?异常应该可以定位,
jshi123 2012-03-15
  • 打赏
  • 举报
回复
试试接收到新的连接请求后清除上次画的曲线,在Accept()后面添加:
Socket temp = s.Accept();
chart1.Series["ShowLine"].Points.Clear();
chart1.Series["正理想脉宽"].Points.Clear();
chart1.Series["负理想脉宽"].Points.Clear();
stonespace 2012-03-15
  • 打赏
  • 举报
回复
估计是Update方法内部有foreach,你把数组绑定到listArray等绑定到chart1里,然后Update里可能用foreach访问listArray等数组,listArray等数组可能在其他线程被增加或者减少元素,导致foreach异常,

你可以做个实验:chart1不直接绑定listArray等数组,而是在绑定之前把listArray等复制一份到另一个临时数组,然后绑定临时数组,估计问题就解决了,


[Quote=引用 5 楼 luoluowen 的回复:]

引用 2 楼 stonespace 的回复:

这个错误一般是foreach循环才会有的,但看了你的代码没发现foreach,异常是哪一行出现的?异常应该可以定位,

异常出现在chart1.update();
[/Quote]

110,530

社区成员

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

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

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