Красный X катастрофических отказов GUI! Я почти разочаровался в решении его!

Я сталкиваюсь со сложной ошибкой с инструментом Dundas Charting for Winforms, используемым с MS Visual Studio 2008 C#.

Следующая ошибка происходит, когда событие GUI генерируется на Объекте диаграммы, в то время как это делает недействительным. Когда ошибка происходит шоу диаграммы dundas большое X меток...

************** Exception Text **************

System.ArgumentOutOfRangeException: Axis Object - The Interval can not be zero
Parameter name: diff
   at Dundas.Charting.WinControl.AxisScale.a(Double )
   at Dundas.Charting.WinControl.Axis.a(Double , Double , AxisScaleSegment , DateTimeIntervalType& )
   at Dundas.Charting.WinControl.Axis.a(ChartGraphics , Boolean , AxisScaleSegment , Boolean )
   at Dundas.Charting.WinControl.Axis.b(ChartGraphics , Boolean , Boolean )
   at Dundas.Charting.WinControl.Axis.Resize(ChartGraphics chartGraph, ElementPosition chartAreaPosition, RectangleF plotArea, Single axesNumber, Boolean autoPlotPosition)
   at Dundas.Charting.WinControl.ChartArea.a(ChartGraphics )
   at Dundas.Charting.WinControl.ChartPicture.Resize(ChartGraphics chartGraph, Boolean calcAreaPositionOnly)
   at Dundas.Charting.WinControl.ChartPicture.Paint(Graphics graph, Boolean paintTopLevelElementOnly, RenderingType renderingType, XmlTextWriter svgTextWriter, Stream flashStream, String documentTitle, Boolean resizable, Boolean preserveAspectRatio)
   at Dundas.Charting.WinControl.ChartPicture.Paint(Graphics graph, Boolean paintTopLevelElementOnly)
   at Dundas.Charting.WinControl.Chart.OnPaint(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Сценарий следующие:

  • У меня есть представление сетки, которое имеет список объектов, которые ссылаются на напечатанный ряд.
  • График обновляется каждая 1 вторая диаграмма использования. Вызовите (AddData)

Это - событие, которое вызывает катастрофический отказ:

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
    {
        AppDataSeries boundData =
dataGridView1[e.ColumnIndex, e.RowIndex].OwningRow.DataBoundItem as AppDataSeries;

        if (boundData.Tag != null)
        // Tag is of Type Dundas.Charting.WinControl.Series
        {
            switch (e.ColumnIndex)
            {
                case 1:
                    MUChart.Series[boundData.SeriesName].ChartArea = 
                          boundData.ChartArea.ToString();
                    // when you change the chart area of a series it
                    // crashes the chart control
                    // also when you enable or disable a series using
                    // series1.Enabled = true,
                    // it could crash the chart control
                    MUChart.ChartAreas[boundData.ChartArea].Visible = true;
                    break;

            }
        }
    }
}

Рисунок сделан следующим образом

Фоновый поток получает

Это генерирует событие

OnDataAvailable каждую секунду

Вот обработчик

void serviceWrapperInstance_DataAvailable(object sender, DataAvailableEventArgs e)
{
    if (e.ViewId == currentViewId)
    {
        if (MUChart.InvokeRequired)
        {
            MUChart.Invoke((MethodInvoker)AddData);
        }

        else
        {
            AddData();
        }
    }
}
public void AddData()
{
    if (MUChart.Series.Count > 0)
    {
        for (int i = 0; i < currentViewSeries.Count; i++)
        {
            AddNewPoint(currentViewSeries[i].XValue, MUChart.Series[i],
currentViewSeries[i].YValue * ((currentViewSeries[i].IsInverse) ? -1 : 1),
currentViewSeries[i].ChartColor);

            dataSaver[MUChart.Series[i].Name].Add(new DataPoint(currentViewSeries[i].XValue,
(double)currentViewSeries[i].YValue));

        }
    }
}
public void AddNewPoint(double xValue, Series ptSeries, double yValue,
Color pointColor)
{
    try
    {
        ptSeries.Points.AddXY(xValue, yValue);
        if (draggedDroppedSeriesMapper.ContainsKey(ptSeries))
            foreach (Series item in draggedDroppedSeriesMapper[ptSeries].DraggedDroppedSeriesVersions)
                item.Points.AddXY(xValue, yValue);
        MUChart.Invalidate();
        // if I remove the previous line the plot doesn’t crash, but doesn’t update !!
    }
    catch (Exception ex)
    {
        Logger.Log(TraceLevel.Error, "AddNewPoint()", ex);
    }
}

Интересная вещь об этой ошибке состоит в том, что этого не происходит на всех машинах. Я заметил, что это происходит на высоких машинах спецификаций как наши 8 ядер процессора машина DELL и новый четырехъядерный ноутбук, который мы получили здесь. Это повысило подозреваемого в проблеме многопоточности; однако, поточная обработка, кажется, хорошо, так как к объекту диаграммы получают доступ от того же основного потока.

Помогите мне с этим

ОБНОВИТЕ присвоение с помощью метода set, который происходит в функциональном dataGridView1_CellEndEdit MUChart. Ряд [boundData. SeriesName].ChartArea = boundData. ChartArea. ToString (); вызовы chart.invalidate внутренне, в то время как вызванный функциональный 'AddData', который обновляет ту диаграмму, называет его явно. Я читал в библиотеке MSDN, что "control.invalidate" не вызывает синхронной краски, если control.update не называют после него. Я почти уверен, что конфликт случайно встречает аннулирование даже при том, что все происходит на том же потоке, так как перерисовка происходит asynchorounsely. Я понял то, что происходит этот путь, но я не знаю, как избежать его. control.update делает меня отрицательный результат.

ChangeTheChartConfigurations (); DrawTheChanges ()---->>>> это работает асинхронно UpdateDataPoints () DrawTheChanges ()---->>>, это работает, в то время как первое изменение еще все еще не произошло. Например, ряд, возможно, был перемещен в область диаграммы различия и Dundas. Построение диаграммы. WinControl. К AxisScale.a (Дважды) (последняя функция в отслеживании стека) уже обращаются скрытая область диаграммы.. это - просто мысль

ОБНОВЛЕНИЕ

Я зарегистрировал идентификатор потока и от обработчика событий и от функции AddNewPoint, и это совпало с основным потоком

6
задан Ian Boyd 8 January 2010 в 21:44
поделиться

5 ответов

, а не признать недействительным диаграммы после нанесения каждой точки, нарисуйте все точки, а затем невернируйте диаграмму один раз. Попробуйте Moving MouseArt.invalidate () с Addnewpoint (), чтобы после цикла в Adddata ().

2
ответ дан 17 December 2019 в 02:29
поделиться
[

] Скорее всего, у вас есть кросс-поток.[

] [

]Попробуйте разместить MUChart.Invalidate после добавления всех точек и в главном потоке графического интерфейса пользователя.[

] [

]Красный крестик обычно рисуется самой структурой .NET, когда вы получаете доступ к управлению пользовательским интерфейсом из другого потока, отличного от потока интерфейса.[

] [

]Крестик также отображается, когда ресурс недоступен или происходит исключение в Control.[

].
1
ответ дан 17 December 2019 в 02:29
поделиться

Я думаю, вы не должны звонить

MUChart.Series[boundData.SeriesName].ChartArea = boundData.ChartArea.ToString();

напрямую. Вы должны обернуть его к инволюрутируемому / вызванному коду. И то же самое для

MUChart.ChartAreas[boundData.ChartArea].Visible = true;
2
ответ дан 17 December 2019 в 02:29
поделиться

Я подозреваю, что у вас есть объект, который был выбран. (Это такое странное исключение, которое вы получаете.) Индикация - это ваше утверждение, которое оно происходит на высококачественных машинах. Значение, машина выполнила сборку мусора.

1) Что происходит, когда вы называете обновление вместо того, чтобы неверно использовать?

2) Удалите длинную цепочку ссылок на объект и создавайте переменные. Вы понимаете, что каждый {} создает локальный объем (стек). Которые могут привести к изменению объема объекта, пока диаграмма обновляется. Сделайте серии S = ​​Lobart.Series [bounddata.seriesname]; Chartarea A = S.chartarea; и так далее.

3) Попробуйте замок или синхронизирующий объект в Addnewpoint или Adddata. Также возможно, что вы делаете, это не безопасно для управления. Проверьте документацию.

4) Я бы не разместил попытку: поймать в Addnewpoint. Лучше - разместить его за пределами на петлю, но в вашем случае положите его в петлю.

5) Вы действительно не должны использовать звонки для обновления, обновления и недействителей. Это указание, что ваша реализация должна быть меньше цикла ЦП тяжелый. (Например, удаление попытки: CALL, обращаясь к любым нескольким «имеющимся данным» событиям, используя блокировку синхронизации, удалите метод AddNewpoint.)

1
ответ дан 17 December 2019 в 02:29
поделиться

Пожалуйста, сосредоточиться на следующей ошибке:

Интервал не может быть нулевым параметром Название: diff

Я думаю, что два значения для оси х диаграммы такое же значение, следовательно, исключение поднимается.

0
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: