Я создал программу для чтения последовательного порта, построения данных и отображения значения. Я использую SwingWorker для сбора, проверки и построения графиков значений, позволяя пользователю остановить сбор данных в графическом интерфейсе. Я считаю, что получаю исключение модификации, когда пытаюсь построить значение, а также показать точное значение.
Ниже представлена упрощенная версия doInBackground(). Строки, которые я стер, по сути, проверяют и сравнивают прочитанное значение.
protected Integer doInBackground()
while (true && !isCancelled()) {
value = initandReadCOM();
// I also check and compare the value
publish(value);
}
return 0;
}
Затем я использую команду process
для построения данных. Ближайшая ветка по этой проблеме, которую я смог найти, предложила использовать это.
@Override
protected void process(List<Float> chunks) {
super.process(chunks);
float factor = chunks.get(chunks.size() - 1);
seriesUpdated = getSeries();
SetDataField(factor);
this.seriesUpdated.add(new Millisecond(), factor);
}
Методы SetDataField
и seriesUpdated
перечислены ниже, если они необходимы для диагностики проблемы.
public void SetDataField(float n) {
this.data_.setText("Data: " + String.valueOf(n));
}
public TimeSeries getSeries() {
return this.series;
}
По мере того, как программа работает в течение более длительного периода времени, это исключение начинает проявляться чаще. Любая помощь будет принята с благодарностью.
Кроме того, пожалуйста, дайте мне знать, если вам нужно увидеть что-то еще, чтобы помочь. Спасибо
РЕДАКТИРОВАТЬ: Ниже приведена трассировка стека
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at java.util.Collections$UnmodifiableCollection$1.next(Unknown Source)
at org.jfree.chart.plot.XYPlot.drawRangeMarkers(XYPlot.java:4088)
at org.jfree.chart.plot.XYPlot.draw(XYPlot.java:3281)
at org.jfree.chart.JFreeChart.draw(JFreeChart.java:1226)
at org.jfree.chart.ChartPanel.paintComponent(ChartPanel.java:1612)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1000(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
synchronized
в ваших методах, которые редактируют/читают из вашего объекта данных. Хотя это не всегда правильный способ решения проблемы, он, по крайней мере, может помочь вам выяснить, где именно возникает проблема. См. docs.oracle.com/javase/tutorial/essential/concurrency/< /а>. - person Chill   schedule 24.10.2013