У меня есть форма окна, в которой есть 1 кнопка (для простоты).
При нажатии этой кнопки я запускаю алгоритм в отдельном фоновом потоке, используя ParameterizedThreadStart.
Теперь этот алгоритм выдаетвыводить через регулярные интервалы времени, которые должны отображаться на диаграмме.
Если я инициализирую диаграмму в MainForm и передам этот объект в поток алгоритма, то он не разрешит и скажет распределение диаграммы идоступ к нему является многопоточным.
Если у меня есть объект диаграммы внутри класса алгоритма, то тики диаграммы не отображаются.Отображается только пустая форма (это также выполняется с помощью _chart.Show ()), а галочки не отображаются.
Кроме того, как добавить точку на график, я использовал chart.Invoke (chart).AddPointDelegate, params) во втором случае, но он застревает в Invoke.
Пожалуйста, помогите мне с выходом.
РЕДАКТИРОВАТЬ:
public MyForm()
{
InitializeComponent();
_getChartDataDelegate = AddTickToChart;
}
public AddTickChartDelegate _getChartDataDelegate;
public void AddTickToChart(ChartTickPoint point)
{
DateTime x = point.X;
double y = point.Y;
object[] parameters = { x, y };
if (this.InvokeRequired)
{// this prevents the invoke loop
this.Invoke(new Action<ChartTickPoint>(_chart.chartDelegate), new object[] { point }); // invoke call for _THIS_ function to execute on the UI thread
}
else
{
//function logic to actually add the datapoint goes here
//_chart.Invoke(_chart.chartDelegate, parameters);
_chart.AddTick(point);
}
}
private void button_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ParameterizedThreadStart(MyUtils.RunAlgo));
AlgoData algoData = new AlgoData(myFile, _getChartDataDelegate);
thread.Start(algoData);
}
// MyForm ends
// Intermediate static Util class to run algo
MyUtils.RunAlgo(object obj)
{
// new Algo
// Get delegate from algoData obj
algo.Run(delegateInTheMyForm);
}
// Algo class's Run
Run(AddTickChartDelegate delegateInTheMyForm)
{
delegateInTheMyForm(point);
}
// Chart class
public AddTickChartDelegate chartDelegate;
public void AddTick(ChartTickPoint point)
{
DateTime timeStamp = point.X;
double y = point.Y;
foreach (Series ptSeries in chart1.Series)
{
AddNewPoint(timeStamp, y, ptSeries);
}
}
Здесь я снова получаю проблему с несколькими потоками в this.Invoke (новое действие ..) в классе MyForm.
Далее,
If i replace this.Invoke(Action..) with chart.Invoke(..)
if (this.InvokeRequired)
{
_chart.Invoke(_chart.chartDelegate, point);
// instead of Action...
}
, затем он проходит, ноформа диаграммы не отвечает требованиям и является пустой.