Я делаю приложение, которое получает предупреждения.Обновление цвета строк TableView потребляет слишком много CPU
Предупреждение может иметь 4 возможных состояния:
- Unresolved_New_0
- Unresolved_New_1
- Unresolved_Old
- Решенный
Когда уведомление получено, оно находится в Unresolved_New_0 состоянии. В течение 10 секунд каждые 0,5 секунды состояние изменяется с Unresolved_New_0 на Unresolved_New_1 и наоборот. В зависимости от состояния I, установите другой цвет фона в строку таблицы (чтобы он вспыхнул на 10 секунд). При прохождении 10 секунд предупреждение переходит в состояние Unresolved_Old. Это приводит к тому, что цвет перестает меняться.
Чтобы реализовать это, у меня есть ScheduledThreadPoolExecutor, который я использую для представления реализации Runnable, которая в течение некоторого времени запускает runnable, используя Platform.runLater.
static class FxTask extends Runnable {
/**
*
* @param runnableDuring Runnable to be run while the task is active (run on the JavaFX application thread).
* @param runnableAfter Runnable to be run after the given duration is elapsed (run on the JavaFX application thread).
* @param duration Duration to run this task for.
* @param unit Time unit.
*/
public static FxTask create(final Runnable runnableDuring, final Runnable runnableAfter, final long duration, final TimeUnit unit) {
return new FxTask(runnableDuring, runnableAfter, duration, unit);
}
@Override
public void run() {
if (System.nanoTime() - mTimeStarted >= mTimeUnit.toNanos(mDuration))
{
cancel();
Platform.runLater(mRunnableAfter);
}
else
Platform.runLater(mRunnableDuring);
}
private FxTask(final Runnable during, final Runnable after, final long duration, final TimeUnit unit) {
mRunnableDuring = during;
mRunnableAfter = after;
mDuration = duration;
mTimeUnit = unit;
mTimeStarted = System.nanoTime();
}
private final Runnable mRunnableDuring;
private final Runnable mRunnableAfter;
private final long mDuration;
private final TimeUnit mTimeUnit;
private final long mTimeStarted;
}
И планировать оповещения с помощью этого Runnable следующим образом:
final Alert alert = new Alert(...);
scheduler.scheduleAtFixedRate(FxTask.create(
() -> {
switch (alert.alertStateProperty().get()) {
case UNRESOLVED_NEW_0:
alert.alertStateProperty().set(Alert.State.UNRESOLVED_NEW_1);
refreshTable(mAlertsTable);
break;
case UNRESOLVED_NEW_1:
alert.alertStateProperty().set(Alert.State.UNRESOLVED_NEW_0);
refreshTable(mAlertsTable);
break;
}
},
() -> { // This is run at the end
if (equalsAny(alert.alertStateProperty().get(), Alert.State.UNRESOLVED_NEW_0, SpreadAlert.State.UNRESOLVED_NEW_1)) {
alert.alertStateProperty().set(Alert.State.UNRESOLVED_OLD);
refreshTable(mAlertsTable);
}
},
10, TimeUnit.SECONDS), 0, 500, TimeUnit.MILLISECONDS
);
Примечание: alertStateProperty() не показан на TableView (это не связано с какой-либо из ее столбцов). Итак, чтобы заставить JavaFx перерисовывать, мне нужно использовать refreshTable(), который, к сожалению, перерисовывает всю таблицу (?).
public static <T> void refreshTable(final TableView<T> table) {
table.getColumns().get(0).setVisible(false);
table.getColumns().get(0).setVisible(true);
}
Проблема заключается в том, что даже если я создаю небольшое количество предупреждений в то же время, использование процессора идет очень высоко: от 20% до 84%, иногда, в среднем около 40%. Когда 10s проходят для всех предупреждений, потребление процессора возвращается к 0%. Если я прокомментирую refreshTable(), CPU останется около 0%, что указывает на то, что это проблема.
Почему так много процессора используется? (Кстати, у меня есть 8 ядер). Есть ли другой способ перерисовать только одну строку без перерисовки всей таблицы?
Я даже попробовал «хакерский» метод - изменение всех значений предупреждений, а затем их возврат обратно, чтобы заставить JavaFx обнаруживать изменения и перерисовывать, но CPU снова был на тех же уровнях.
Является ли 'Alert' тип элемента для' TableView'? Как вы на самом деле меняете цвет строки при изменении свойства (я вижу, что вы перерисовываете весь первый столбец, что вам не нужно делать, но когда вы показываете столбец, как он определяется цветом?) , –