0

我有两种方法可以一起工作,它们制作了一个大的双数组(每 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 回答