2009-07-23 8 views
0

Ich habe zwei Methoden, die zusammenarbeiten, und sie machen eine große Doppel-Array (jedes 1/1000000S 5000 Element) und dieses Array sollte ein Diagramm (Dundas-Diagramm) zeigen. Aber das Diagramm wird nicht aktualisiert.Hilfe aktualisieren Diagramm

Bitte helfen Sie mir!

Entschuldigung für mein schlechtes Englisch!

Diese meinen Code:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.Runtime.InteropServices; 
using System.Threading; 
using Dundas.Charting.WinControl; 
using Dundas.Charting.WinControl.Utilities; 


namespace Online_Detector 
{ 
    public partial class frmMain : Form 
    { 
     public frmMain() 
     { 
      InitializeComponent(); 
     } 

     #region Fields 
     double fName = 0; 
     public object dataDigitalGlobal; 
     long num; 
     #endregion 

     #region Method 
     private void ManualSavetoFile(double Value, double Time) 
     { 
      //Get Path 
      //fName += 1; 
      string IntLocation = Convert.ToString(fName) + ".txt"; 

      #region Write File 

      FileStream FOut = null; 

      try 
      { 

       if (File.Exists(IntLocation)) 
        FOut = new FileStream(IntLocation, FileMode.Append, FileAccess.Write, FileShare.ReadWrite, 4096, true); 
       else 
        FOut = new FileStream(IntLocation, FileMode.Create, FileAccess.Write, FileShare.ReadWrite, 4096, true); 

       StreamWriter SOut = new StreamWriter(FOut); 


       // <Add Line To Export File > 
       lock (this) 
       { 
        if (FOut.CanWrite) 
        { 
         SOut.WriteLine(Value); 
         SOut.WriteLine(Time); 
        } 
       } 
       // <Add Line To Export File > 

       SOut.Close(); 
       FOut.Close(); 

      } 

      catch (IOException Err) 
      { 
       MessageBoxManager.OK = "&تاييد"; 
       MessageBoxManager.Register(); 
       MessageBox.Show("خطاي زير در عمليات تهيه فايل خروجي رخ داد:" + "\r" + Err.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading); 
       MessageBoxManager.Unregister(); 
      } 

      catch (FieldAccessException Err) 
      { 
       MessageBoxManager.OK = "&تاييد"; 
       MessageBoxManager.Register(); 
       MessageBox.Show("خطاي زير در عمليات تهيه فايل خروجي رخ داد:" + "\r" + Err.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading); 
       MessageBoxManager.Unregister(); 
      } 

      catch (Exception Err) 
      { 
       MessageBoxManager.OK = "&تاييد"; 
       MessageBoxManager.Register(); 
       MessageBox.Show("خطاي زير در عمليات تهيه فايل خروجي رخ داد:" + "\r" + Err.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading); 
       MessageBoxManager.Unregister(); 
      } 

      finally 
      { 
       FOut.Close(); 
      } 

      #endregion //Write File 

     } 
     #endregion 

     #region Event on Tab Report 
     private void btnStart_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       //check all the setting 
       axAdvAICtrl.ChannelScanStart = Convert.ToInt32(txtChannelStart.Text); 
       axAdvAICtrl.ChannelScanCount = Convert.ToInt32(txtChannelCount.Text); 

       int count = int.Parse(txtDataCount.Text); 

       // Ocx allocate the buffer of DataDigital ,equal to new object!    
       dataDigitalGlobal = null; 
       // Engage the FAI with Asychronous mode 
       count = axAdvAICtrl.AcquireBulkDataToMemory(count, out dataDigitalGlobal, -1, chkCylic.Checked, false); 
       num = 0; 
       // Disable all controls on the form 
       btnStart.Enabled = false; 
       // and only Enable the Stop button 
       btnEnd.Enabled = true; 
      } 
      catch (Exception err) 
      { 
       MessageBox.Show(err.Message, "Error"); 
       axAdvAICtrl.StopAcquireBulkData(0); 
      } 

     } 

     private void btnEnd_Click(object sender, EventArgs e) 
     { 
      //stop the acquisition 
      axAdvAICtrl.StopAcquireBulkData(0); 

      // Enable all controls on the form 
      btnStart.Enabled = true; 
      // and only Disable the Stop button 
      btnEnd.Enabled = false; 
     } 

     #endregion 
     //this event every 1/500000 
     private void axAdvAICtrl_OnFirstHalfBulkDataReady(object sender, AxAdvAILib._IAdvAIEvents_OnFirstHalfBulkDataReadyEvent e) 
     { 
      #region "Get Data " 
      try 
      { 
       object analogArray = e.analogArray; 
       long i; 

       if (analogArray != null) 
       { 
        float[] voltage; 
        voltage = (float[])analogArray; 
        for (i = 0; i < Convert.ToInt32(txtDataCount.Text)/2; i++) 
        { 
         // Write Data To Manual file 
         ManualSavetoFile(voltage[i], (num/axAdvAICtrl.DataSampleRate)); 

         // Define some variables 
         int numberOfPointsInChart = Convert.ToInt32(txtDataCount.Text); 
         int numberOfPointsAfterRemoval = 1; 

         chaIon.Series["Series1"].Points.AddXY(xValue[arrayCounter], yValue[arrayCounter]); 

         // Keep a constant number of points by removing them from the left 
         while (chaIon.Series[0].Points.Count > numberOfPointsInChart) 
         { 
          // Remove data points on the left side 
          while (chaIon.Series[0].Points.Count > numberOfPointsAfterRemoval) 
          { 
           chaIon.Series[0].Points.RemoveAt(0); 
          } 

         } 
         chaIon.Invalidate(); 
         num++; 
        } 
       } 
      } 
      catch (Exception err) 
      { 
       threadChart.Abort(); 
       MessageBox.Show(err.Message, "Error"); 
      } 
      #endregion 
     } 

     //this event every 1/500000 
     private void axAdvAICtrl_OnSecondHalfBulkDataReady(object sender, AxAdvAILib._IAdvAIEvents_OnSecondHalfBulkDataReadyEvent e) 
     { 
      #region "Get Data " 
      try 
      { 
       object analogArray = e.analogArray; 
       long i; 

       if (analogArray != null) 
       { 
        float[] voltage; 
        voltage = (float[])analogArray; 
        for (i = 0; i < Convert.ToInt32(txtDataCount.Text)/2; i++) 
        { 
         // Write Data To Manual file 
         ManualSavetoFile(voltage[i], (num/axAdvAICtrl.DataSampleRate)); 

         // Define some variables 
         int numberOfPointsInChart = Convert.ToInt32(txtDataCount.Text); 
         int numberOfPointsAfterRemoval = 1; 

         chaIon.Series["Series1"].Points.AddXY(xValue[arrayCounter], yValue[arrayCounter]); 

         // Keep a constant number of points by removing them from the left 
         while (chaIon.Series[0].Points.Count > numberOfPointsInChart) 
         { 
          // Remove data points on the left side 
          while (chaIon.Series[0].Points.Count > numberOfPointsAfterRemoval) 
          { 
           chaIon.Series[0].Points.RemoveAt(0); 
          } 

         } 
         chaIon.Invalidate(); 
         num++; 
        } 
       } 
      } 
      catch (Exception err) 
      { 
       threadChart.Abort(); 
       MessageBox.Show(err.Message, "Error"); 
      } 
      #endregion 
     } 

     private void frmMain_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      axAdvAICtrl.StopAcquireBulkData(0); 
     } 
    } 
} 
+0

Können Sie einen Beispielcode angeben? –

+0

Versuchen Sie, Code zu schreiben, wir können nicht wirklich wissen, was vor sich geht, bis wir etwas sehen. – AlbertoPL

+0

Ein Beispiel für einen Code wäre nützlich. – AnthonyWJones

Antwort

1

Typischerweise alle Aktualisierungen UI-Komponenten sollten auf dem UI-Thread ausgeführt werden, über Control.Invoke (oder die WPF-Äquivalent). Es ist möglich, dass Ihre Änderungen Ausnahmen verursachen, die irgendwo verschluckt werden.

Funktioniert der Code für den UI-Thread? Sie können immer noch eine BackgroundWorker verwenden - Sie müssen nur die Updates (idealerweise in Batches) über Invoke tun.