0

一緒に機能する 2 つの方法があり、それらは大きな double 配列 (1/1000000S 5000 アイテムごと) を作成し、この配列はチャート (Dundas チャート) を表示する必要があります。しかし、チャートは更新されていません。

私を助けてください!

私の悪い英語でごめんなさい!

この私のコード:

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);
        }
    }
}
4

1 に答える 1

1

通常、UIコンポーネントの更新は、UIスレッドでControl.Invoke(または同等のWPFを介して)実行する必要があります。変更により、どこかに飲み込まれている例外が発生している可能性があります。

コードはUIスレッドから機能しますか?引き続き使用できますBackgroundWorker-を介して(理想的にはバッチで)更新を行う必要がありますInvoke

于 2009-07-23T12:38:25.653 に答える