数据通信的问题 不明白你这样设计是基于什么考虑为什么要单线程循环读两台PC??你定义2个线程不停的去读PC,然后分别放到两个list里再在timer里定时去从不同的队列里分别取出4000点显示在图表上,不就得了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 既然sc1和sc2是按同步顺序读数据,那么你可以考虑用一个线程从targetPC读数据,然后把数据显示在图表上 1. sc1和sc2读取同一个数据源吗?2. sc1和sc2读取数据有先后顺序的要求吗?如果1和2两个都是肯定的答案,那么你可以这么做sc1触发之后,读取4000个点的数据,然后你把这个4000点的数据,推荐到图表显示的机器上,然后再通知sc2,去读取4000点,再推到图表显示的机器上,或是你在把4000点推到图表显示的机器上的同时,去触发sc2的动作。你看看这样的思路对你有没有帮助。 你说的就是我现在的思路,但就是读完4000个点老是顿一下,然后才再接着读后面的4000点if (sc1.Status == SCSTATUS.FINISHED) { xPCDataHostScSignalObject scDataObj = sc1.DataTimeObject; Time1 = scDataObj.GetData(); Data1 = sc1.Signals["Gain"].HostScopeSignalDataObject.GetData(); for (int i = 0; i < Data1.Count(); i += 100) { Array.Copy(Time1, i, timetemp, 0, 100); Array.Copy(Data1, i, datatemp, 0, 100); ds0.Append(timetemp, datatemp); Thread.Sleep(15); } sc1.Start(); } if (sc2.Status == SCSTATUS.FINISHED) { xPCDataHostScSignalObject scDataObj = sc2.DataTimeObject; Time2 = scDataObj.GetData(); Data2 = sc2.Signals["Gain"].HostScopeSignalDataObject.GetData(); for (int i = 0; i < Data2.Count(); i += 100) { Array.Copy(Time2, i, timetemp, 0, 100); Array.Copy(Data2, i, datatemp, 0, 100); ds0.Append(timetemp, datatemp); Thread.Sleep(15); } sc2.Start(); } 给你看一下我的代码吧 thread = new Thread(new ThreadStart(run)); thread.IsBackground = true; thread.Start();private void run() { while (true) { if (sc1.Status == SCSTATUS.FINISHED) { xPCDataHostScSignalObject scDataObj = sc1.DataTimeObject; Time1 = scDataObj.GetData(); Data1 = sc1.Signals["Gain"].HostScopeSignalDataObject.GetData(); for (int i = 0; i < Data1.Count(); i += 100) { Array.Copy(Time1, i, timetemp, 0, 100); Array.Copy(Data1, i, datatemp, 0, 100); ds0.Append(timetemp, datatemp); Thread.Sleep(15); } sc1.Start(); } if (sc2.Status == SCSTATUS.FINISHED) { xPCDataHostScSignalObject scDataObj = sc2.DataTimeObject; Time2 = scDataObj.GetData(); Data2 = sc2.Signals["Gain"].HostScopeSignalDataObject.GetData(); for (int i = 0; i < Data2.Count(); i += 100) { Array.Copy(Time2, i, timetemp, 0, 100); Array.Copy(Data2, i, datatemp, 0, 100); ds0.Append(timetemp, datatemp); Thread.Sleep(15); } sc2.Start(); } } } 我之前可能没有说清楚,我就是用的一个线程从targetPC读数据,请看一下代码吧 thread = new Thread(new ThreadStart(run)); thread.IsBackground = true; thread.Start();private void run() { while (true) { if (sc1.Status == SCSTATUS.FINISHED) { xPCDataHostScSignalObject scDataObj = sc1.DataTimeObject; Time1 = scDataObj.GetData(); Data1 = sc1.Signals["Gain"].HostScopeSignalDataObject.GetData(); for (int i = 0; i < Data1.Count(); i += 100) { Array.Copy(Time1, i, timetemp, 0, 100); Array.Copy(Data1, i, datatemp, 0, 100); ds0.Append(timetemp, datatemp); Thread.Sleep(15); } sc1.Start(); } if (sc2.Status == SCSTATUS.FINISHED) { xPCDataHostScSignalObject scDataObj = sc2.DataTimeObject; Time2 = scDataObj.GetData(); Data2 = sc2.Signals["Gain"].HostScopeSignalDataObject.GetData(); for (int i = 0; i < Data2.Count(); i += 100) { Array.Copy(Time2, i, timetemp, 0, 100); Array.Copy(Data2, i, datatemp, 0, 100); ds0.Append(timetemp, datatemp); Thread.Sleep(15); } sc2.Start(); } } } 我就使逻辑想不出来了,所以才来网上求助的。发代码就是想让你们能理解我到底想干什么。没有人有耐心帮你看代码的。代码是没有问题,就是想让你们明白我是什么意思,问题是可能和windows不是real time有关,因为假设windows每读4000个点也就是1秒钟,但是windows可能要用1.2秒钟,就多出来那么0.2秒,我现在就在想如何把这0.2秒钟去掉,使图表显得更顺畅。 所以说,你根本就是没弄清楚windows的工作方式,就拍脑袋想了个方案,以为是那样的,其实不是那样的.我不知道你的线程到底从哪里读数据,也不关心.但是你如果想数据是连续的,而不是读完数据,线程就休息0.2秒你就应该双线程不停去读数据,而不是在一个线程里来回切换 谢谢你的回答,我刚才又想了想,这和一个线程里来回切换没有关系,因为我已经把数据以4000个点为一个paket放到puffer里了,然后我现在要做的是把这些paket一个一个读出来,但是在每个paket之间总会有一个延迟,就是所说的0.2秒。 谢谢你的回答,我刚才又想了想,这和一个线程里来回切换没有关系,因为我已经把数据以4000个点为一个paket放到puffer里了,然后我现在要做的是把这些paket一个一个读出来,但是在每个paket之间总会有一个延迟,就是所说的0.2秒。paket就是package 如何通过网页安装程序? visual studio 2005 字体设置 关于控件tabControl?? 如何实现三行三列 求一正则 我的简单记事本代码--Windows编程(c#) textbox中只有n个回车,没有其他任何字符,如何替换其中的某一个回车为其它字符? 迷茫的程序人生,程序员以后的方向 如何创建安装到PPC的安装项目? 用MSCOMM操作有线MODEM可以,但操作无线MODEM就不行了,大家帮帮忙吧,是不是有不同的地方 使用asp.net做一个地图查询 【linq】如何在Select的同时过滤
2. sc1和sc2读取数据有先后顺序的要求吗?如果1和2两个都是肯定的答案,那么你可以这么做
sc1触发之后,读取4000个点的数据,然后你把这个4000点的数据,推荐到图表显示的机器上,然后再通知sc2,去读取4000点,再推到图表显示的机器上,或是你在把4000点推到图表显示的机器上的同时,去触发sc2的动作。
你看看这样的思路对你有没有帮助。
你说的就是我现在的思路,但就是读完4000个点老是顿一下,然后才再接着读后面的4000点
if (sc1.Status == SCSTATUS.FINISHED)
{
xPCDataHostScSignalObject scDataObj = sc1.DataTimeObject;
Time1 = scDataObj.GetData();
Data1 = sc1.Signals["Gain"].HostScopeSignalDataObject.GetData();
for (int i = 0; i < Data1.Count(); i += 100)
{
Array.Copy(Time1, i, timetemp, 0, 100);
Array.Copy(Data1, i, datatemp, 0, 100);
ds0.Append(timetemp, datatemp);
Thread.Sleep(15);
}
sc1.Start();
}
if (sc2.Status == SCSTATUS.FINISHED)
{
xPCDataHostScSignalObject scDataObj = sc2.DataTimeObject;
Time2 = scDataObj.GetData();
Data2 = sc2.Signals["Gain"].HostScopeSignalDataObject.GetData();
for (int i = 0; i < Data2.Count(); i += 100)
{
Array.Copy(Time2, i, timetemp, 0, 100);
Array.Copy(Data2, i, datatemp, 0, 100);
ds0.Append(timetemp, datatemp);
Thread.Sleep(15);
}
sc2.Start();
}
给你看一下我的代码吧
thread = new Thread(new ThreadStart(run));
thread.IsBackground = true;
thread.Start();
private void run()
{
while (true)
{
if (sc1.Status == SCSTATUS.FINISHED)
{
xPCDataHostScSignalObject scDataObj = sc1.DataTimeObject;
Time1 = scDataObj.GetData();
Data1 = sc1.Signals["Gain"].HostScopeSignalDataObject.GetData();
for (int i = 0; i < Data1.Count(); i += 100)
{
Array.Copy(Time1, i, timetemp, 0, 100);
Array.Copy(Data1, i, datatemp, 0, 100);
ds0.Append(timetemp, datatemp);
Thread.Sleep(15);
}
sc1.Start();
}
if (sc2.Status == SCSTATUS.FINISHED)
{
xPCDataHostScSignalObject scDataObj = sc2.DataTimeObject;
Time2 = scDataObj.GetData();
Data2 = sc2.Signals["Gain"].HostScopeSignalDataObject.GetData();
for (int i = 0; i < Data2.Count(); i += 100)
{
Array.Copy(Time2, i, timetemp, 0, 100);
Array.Copy(Data2, i, datatemp, 0, 100);
ds0.Append(timetemp, datatemp);
Thread.Sleep(15);
}
sc2.Start();
}
}
}
thread.IsBackground = true;
thread.Start();
private void run()
{
while (true)
{
if (sc1.Status == SCSTATUS.FINISHED)
{
xPCDataHostScSignalObject scDataObj = sc1.DataTimeObject;
Time1 = scDataObj.GetData();
Data1 = sc1.Signals["Gain"].HostScopeSignalDataObject.GetData();
for (int i = 0; i < Data1.Count(); i += 100)
{
Array.Copy(Time1, i, timetemp, 0, 100);
Array.Copy(Data1, i, datatemp, 0, 100);
ds0.Append(timetemp, datatemp);
Thread.Sleep(15);
}
sc1.Start();
}
if (sc2.Status == SCSTATUS.FINISHED)
{
xPCDataHostScSignalObject scDataObj = sc2.DataTimeObject;
Time2 = scDataObj.GetData();
Data2 = sc2.Signals["Gain"].HostScopeSignalDataObject.GetData();
for (int i = 0; i < Data2.Count(); i += 100)
{
Array.Copy(Time2, i, timetemp, 0, 100);
Array.Copy(Data2, i, datatemp, 0, 100);
ds0.Append(timetemp, datatemp);
Thread.Sleep(15);
}
sc2.Start();
}
}
}
我不知道你的线程到底从哪里读数据,也不关心.
但是你如果想数据是连续的,而不是读完数据,线程就休息0.2秒
你就应该双线程不停去读数据,而不是在一个线程里来回切换
paket就是package