Hi,
I trying to update a table with multiple columns in my C# project.My intention is to log values from electronics at regular interval(4sec). I was able to update table as i want and saving table value in .excel file.
It works fine for some time but after sometime the project will stuck, either i have to close or restart the PC. If i don't update the table then the project works fine for days.
I have a code to draw chart from table values, even i tried without chart drawing or without update chart function and only updating table even though it was same problem
It will work for 5 hours, updating table every 4 sec.
I have a code to update table like this.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Steema.TeeChart;
using Steema.TeeChart.Styles;
using System.Windows.Forms;
using NativeExcel;
namespace SensorLog
{
public class Log
{
private TChart _chart;
private DataGridView _list;
private DataTable _table = new DataTable("EngineeringData");
private string _logFile;
private long _recs = 0;
private int _logs = 0;
private IWorkbook book;
private IWorksheet sheet;
public Log(TChart chart, DataGridView list)
{
_chart = chart;
_list = list;
_list.DataSource = _table;
MakeTable();
book = Factory.CreateWorkbook();
_logFile = "Log_"
+ DateTime.Now.Year.ToString()
+ "-"
+ DateTime.Now.Month.ToString()
+ "-"
+ DateTime.Now.Day.ToString()
+ "_"
+ DateTime.Now.Hour.ToString()
+ "-"
+ DateTime.Now.Minute.ToString()
+ "_.xls";
}
public void Start()
{
_table.Clear();
_recs = 0;
sheet = book.Worksheets.Add();
AnalogSensor.NewAnalogSensorData
+= new EventHandler<AnalogSensorDataEventArgs>(AnalogSensor_NewAnalogSensorData);
}
public void Stop()
{
int i = 1;
foreach (DataColumn c in _table.Columns)
{
sheet.Cells[1, i].Value = c.ColumnName;
sheet.Cells[2, i++].Value = c.Caption;
}
book.SaveAs(_logFile);
AnalogSensor.NewAnalogSensorData
-= new EventHandler<AnalogSensorDataEventArgs>(AnalogSensor_NewAnalogSensorData);
}
void AnalogSensor_NewAnalogSensorData(object sender, AnalogSensorDataEventArgs e)
{
if (e.Data.Priority > 0)
{
if (_list.InvokeRequired)
_list.Invoke((MethodInvoker)delegate { UpdateTable(e.Data); });
else
UpdateTable(e.Data);
UpdateChart(e.Data);
}
}
private void MakeTable()
{
DataColumn[] keys = new DataColumn[1];
Type type = Type.GetType("System.UInt64");
keys[0] = MakeColumn("Index", type, true);
_table.PrimaryKey = keys;
type = Type.GetType("System.DateTime");
MakeColumn("DateTime", type, true);
_list.Columns["DateTime"].Visible = false;
type = Type.GetType("System.String");
MakeColumn("Time", type, false);
type = Type.GetType("System.Double");
MakeColumn(SystemNames.PressA, type, false);
MakeColumn(SystemNames.PressB, type, false);
MakeColumn(SystemNames.AnalogA, type, false);
MakeColumn(SystemNames.AnalogB, type, false);
MakeColumn(SystemNames.AnalogC, type, false);
MakeColumn(SystemNames.AnalogD, type, false);
MakeColumn(SystemNames.TempA, type, false);
MakeColumn(SystemNames.TempB, type, false);
MakeColumn(SystemNames.TempC, type, false);
}
private DataColumn MakeColumn(string name, Type type, bool state)
{
DataColumn column = new DataColumn();
column.ColumnName = name;
column.DataType = type;
column.AutoIncrement = false;
column.Caption = name;
column.ReadOnly = false;
column.Unique = false;
_table.Columns.Add(column);
_list.Columns[name].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
_list.Columns[name].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
return column;
}
private void UpdateTable(AnalogSensorData data)
{
DataRow row = _table.Rows.Find(_recs);
if (row == null)
{
row = _table.NewRow();
row["Index"] = _recs;
row["DateTime"] = data.Time;
row["Time"] = data.Time.ToLongTimeString();
row[data.SystemName] = data.Eng;
_logs = 1;
_table.Rows.Add(row);
}
else
{
row[data.SystemName] = data.Eng;
if (++_logs >= SensorUC.NumberOfActive)
{
int i = 1;
foreach (var item in row.ItemArray)
{
sheet.Cells[(int)_recs + 3, i++].Value = item;
}
book.SaveAs(_logFile);
_recs++;
}
}
if (!_list.Columns[data.SystemName].HeaderText.Equals(data.SensorName))
{
_table.Columns[data.SystemName].Caption = data.SensorName;
_list.Columns[data.SystemName].HeaderText = data.SensorName;
}
_list.FirstDisplayedCell = _list.Rows[_list.Rows.Count - 1].Cells[0];
_list.Update();
}
private void UpdateChart(AnalogSensorData data)
{
if (data.Line.DataSource == null)
{
if (_chart.InvokeRequired)
{
_chart.Invoke((MethodInvoker)delegate
{
_chart.Series.Add(data.Line);
data.Line.DataSource = _table;
});
}
else
{
_chart.Series.Add(data.Line);
data.Line.DataSource = _table;
}
}
if (_chart.InvokeRequired)
{
_chart.Invoke((MethodInvoker)delegate { data.Line.CheckDataSource(); });
}
else
{
data.Line.CheckDataSource();
}
}
}
}
Can someone help me what might be the reason? or how to prevent it?