11-10-2015 06:51 AM - edited 11-10-2015 06:55 AM
When I'm starting the following program (WPF .net4.0, NI.common (13.0.40.190), NI.Controls.Graph (13.0.40.242) ) I'm getting the following error message from the debugger
ObjectDisposedException was unhandled
The data store was modified.
Object name: 'Buffer<Int32>'.
Source: NI.Common
I have a device class that generates every few milli seconds some random data. I notify my main class via Events and pass the values via paramter.
In XAML I bind the graph data to a ChartCollection as follows: (the bold lines are most relevant)
The error occurs only when the timing of my data provider gets over a certain treshold.
500ms - all is fine
200ms - runs ok, but crashes with exception when I change the window size
20ms - still ok
10ms - crashes instantly with the exception
{
Data data = new Data();
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
private ChartCollection<double> _chartCollection1 = new ChartCollection<double>(1000);
private ChartCollection<double> _chartCollection2 = new ChartCollection<double>(1000);
private ChartCollection<double> _chartCollection3 = new ChartCollection<double>(1000);
private ChartCollection<double> _chartCollection4 = new ChartCollection<double>(1000);
public ChartCollection<double> Graph1
{
get { return _chartCollection1; }
set
{
if (_chartCollection1.Equals(value))
{
return;
}
_chartCollection1 = value;
OnPropertyChanged("Graph1");
}
}
public ChartCollection<double> Graph2
{
get { return _chartCollection2; }
set
{
if (_chartCollection2.Equals(value))
{
return;
}
_chartCollection2 = value;
OnPropertyChanged("Graph2");
}
}
public ChartCollection<double> Graph3
{
get { return _chartCollection3; }
set
{
if (_chartCollection3.Equals(value))
{
return;
}
_chartCollection3 = value;
OnPropertyChanged("Graph3");
}
}
public ChartCollection<double> Graph4
{
get { return _chartCollection4; }
set
{
if (_chartCollection4.Equals(value))
{
return;
}
_chartCollection4 = value;
OnPropertyChanged("Graph4");
}
}
public MainWindow()
{
InitializeComponent();
GraphView graphView = new GraphView();
ContentControlGraph.Content = graphView;
ContentControlGraph.DataContext = this;
data.dataReadyEvent += dataEventHandler;
Closing += MainWindow_Closing;
}
void MainWindow_Closing(object sender, CancelEventArgs e)
{
data.Stop();
Environment.Exit(0);
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
data.Start();
}
private int j;
private void dataEventHandler(object sender, EventArgs e)
{
j++;
if (j == 1)
{
Graph1.Append((double[])sender);
}
else if (j == 2)
{
Graph2.Append((double[])sender);
}
else if (j == 3)
{
Graph3.Append((double[])sender);
}
else
{
Graph4.Append((double[])sender);
j = 0;
}
}
}
The exception occurs in the DLL, so I cant catch it either.
Solved! Go to Solution.
11-10-2015 11:14 AM
I believe you are running into the multi-threading issue described here: Can't get Graph.DataSource to work in WPF i (threading issue?).
In short, your chart append calls should be marshaled to the UI thread.