不明白你这样设计是基于什么考虑
为什么要单线程循环读两台PC??
你定义2个线程不停的去读PC,然后分别放到两个list里
再在timer里定时去从不同的队列里分别取出4000点显示在图表上,不就得了

解决方案 »

  1.   

    既然sc1和sc2是按同步顺序读数据,那么你可以考虑用一个线程从targetPC读数据,然后把数据显示在图表上
      

  2.   

    1. sc1和sc2读取同一个数据源吗?
    2. sc1和sc2读取数据有先后顺序的要求吗?如果1和2两个都是肯定的答案,那么你可以这么做
    sc1触发之后,读取4000个点的数据,然后你把这个4000点的数据,推荐到图表显示的机器上,然后再通知sc2,去读取4000点,再推到图表显示的机器上,或是你在把4000点推到图表显示的机器上的同时,去触发sc2的动作。
    你看看这样的思路对你有没有帮助。
      

  3.   


    你说的就是我现在的思路,但就是读完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();
                                    }
      

  4.   


    给你看一下我的代码吧 
     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();
                                     }
                }
            }
      

  5.   

    我之前可能没有说清楚,我就是用的一个线程从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();                        
            }        
         }      
      }
      

  6.   

    我就使逻辑想不出来了,所以才来网上求助的。发代码就是想让你们能理解我到底想干什么。没有人有耐心帮你看代码的。代码是没有问题,就是想让你们明白我是什么意思,问题是可能和windows不是real time有关,因为假设windows每读4000个点也就是1秒钟,但是windows可能要用1.2秒钟,就多出来那么0.2秒,我现在就在想如何把这0.2秒钟去掉,使图表显得更顺畅。
      

  7.   

    所以说,你根本就是没弄清楚windows的工作方式,就拍脑袋想了个方案,以为是那样的,其实不是那样的.
    我不知道你的线程到底从哪里读数据,也不关心.
    但是你如果想数据是连续的,而不是读完数据,线程就休息0.2秒
    你就应该双线程不停去读数据,而不是在一个线程里来回切换
      

  8.   

    谢谢你的回答,我刚才又想了想,这和一个线程里来回切换没有关系,因为我已经把数据以4000个点为一个paket放到puffer里了,然后我现在要做的是把这些paket一个一个读出来,但是在每个paket之间总会有一个延迟,就是所说的0.2秒。
      

  9.   

    谢谢你的回答,我刚才又想了想,这和一个线程里来回切换没有关系,因为我已经把数据以4000个点为一个paket放到puffer里了,然后我现在要做的是把这些paket一个一个读出来,但是在每个paket之间总会有一个延迟,就是所说的0.2秒。
    paket就是package