diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginResources.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginResources.properties index 8e69e557a00..abccb0816d2 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginResources.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginResources.properties @@ -24,6 +24,9 @@ ConsolePreferencePage.consoleWrapLines.label=Wrap lines on the console ConsolePreferencePage.consoleLines.label=Limit console output (number of lines): ConsolePreferencePage.consoleLines.tooltip=This is a fuzzy limit, optimized for best performance. The actual limit will be between this value and 2 times this value. ConsolePreferencePage.consoleLines.errorMessage=Value must be an integer between 10 and 2147483647 +ConsolePreferencePage.consoleUpdateDelay.label=Delay updated between console updates (milliseconds): +ConsolePreferencePage.consoleUpdateDelay.tooltip=The number of milliseconds between each console view update to allow other operations to perform UI operations. +ConsolePreferencePage.consoleUpdateDelay.errorMessage=Value must be an integer between 0 and 2147483647 ConsolePreferencePage.tabWidth.label=Display tab width: ConsolePreferencePage.tabWidth.errorMessage=Value must be an integer between 1 and 100 ConsolePreferencePage.colorSettings.label=Console text color settings diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsolePartitioner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsolePartitioner.java index 16aab00f3ad..741c95395af 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsolePartitioner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsolePartitioner.java @@ -102,6 +102,8 @@ public class BuildConsolePartitioner */ private LogFile fLogFile = new LogFile(); + private int fUpdateDelay = BuildConsolePreferencePage.DEFAULT_BUILDCONSOLE_UPDATE_DELAY_MS; + /** * Construct a partitioner that is not associated with a specific project */ @@ -116,6 +118,7 @@ public class BuildConsolePartitioner fDocument = new BuildConsoleDocument(); fDocument.setDocumentPartitioner(this); fDocumentMarkerManager = new DocumentMarkerManager(fDocument, this); + fUpdateDelay = BuildConsolePreferencePage.buildConsoleUpdateDelayMs(); connect(fDocument); } @@ -206,27 +209,12 @@ public class BuildConsolePartitioner } /** - * Update the UI after a short delay. The reason for a short delay is to try - * and reduce the "frame rate" of the build console updates, this reduces - * the total load on the main thread. User's won't be able to tell that - * there is an extra delay. - * - * A too short time has little effect and a too long time starts to be - * visible to the user. With my experiments to get under 50% CPU utilization - * on the main thread requires at least 35 msec delay between updates. 250 - * msec leads to visible delay to user and ~20% utilization. And finally the - * chosen value, 75 msec leads to ~35% utilization and no user visible - * delay. - */ - private static final int UDPATE_DELAY_MS = 75; - - /** - * @see #UDPATE_DELAY_MS + * @see BuildConsolePreferencePage#DEFAULT_BUILDCONSOLE_UPDATE_DELAY_MS */ private void scheduleUpdate() { Display display = CUIPlugin.getStandardDisplay(); if (display != null) { - display.timerExec(UDPATE_DELAY_MS, this::updateUI); + display.timerExec(fUpdateDelay, this::updateUI); } } @@ -435,6 +423,9 @@ public class BuildConsolePartitioner if (event.getProperty() == BuildConsolePreferencePage.PREF_BUILDCONSOLE_LINES) { setDocumentSize(BuildConsolePreferencePage.buildConsoleLines()); } + if (event.getProperty() == BuildConsolePreferencePage.PREF_BUILDCONSOLE_UPDATE_DELAY_MS) { + fUpdateDelay = BuildConsolePreferencePage.buildConsoleUpdateDelayMs(); + } } @Override diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/BuildConsolePreferencePage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/BuildConsolePreferencePage.java index 986044107f9..bb291056832 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/BuildConsolePreferencePage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/BuildConsolePreferencePage.java @@ -42,6 +42,7 @@ public class BuildConsolePreferencePage extends FieldEditorPreferencePage implem public static final String PREF_BUILDCONSOLE_TAB_WIDTH = "buildConsoleTabWith"; //$NON-NLS-1$ public static final String PREF_BUILDCONSOLE_LINES = "buildConsoleLines"; //$NON-NLS-1$ + public static final String PREF_BUILDCONSOLE_UPDATE_DELAY_MS = "buildConsoleUpdateDelayMs"; //$NON-NLS-1$ public static final String PREF_BUILDCONSOLE_INFO_COLOR = "buildConsoleInfoStreamColor"; //$NON-NLS-1$ public static final String PREF_BUILDCONSOLE_OUTPUT_COLOR = "buildConsoleOutputStreamColor"; //$NON-NLS-1$ public static final String PREF_BUILDCONSOLE_ERROR_COLOR = "buildConsoleErrorStreamColor"; //$NON-NLS-1$ @@ -51,6 +52,22 @@ public class BuildConsolePreferencePage extends FieldEditorPreferencePage implem public static final String PREF_BUILDCONSOLE_PROBLEM_INFO_BACKGROUND_COLOR = "buildConsoleProblemInfoBackgroundColor"; //$NON-NLS-1$ public static final String PREF_BUILDCONSOLE_PROBLEM_HIGHLIGHTED_COLOR = "buildConsoleProblemHighlightedColor"; //$NON-NLS-1$ + /** + * Update the UI after a short delay. The reason for a short delay is to try + * and reduce the "frame rate" of the build console updates, this reduces + * the total load on the main thread. User's won't be able to tell that + * there is an extra delay. + * + * A too short time has little effect and a too long time starts to be + * visible to the user. With my experiments to get under 50% CPU utilization + * on the main thread requires at least 35 msec delay between updates. 250 + * msec leads to visible delay to user and ~20% utilization. And finally the + * chosen value, 75 msec leads to ~35% utilization and no user visible + * delay. + */ + public static final int DEFAULT_BUILDCONSOLE_UPDATE_DELAY_MS = 75; + + public BuildConsolePreferencePage() { super(GRID); setPreferenceStore(CUIPlugin.getDefault().getPreferenceStore()); @@ -87,6 +104,14 @@ public class BuildConsolePreferencePage extends FieldEditorPreferencePage implem buildCount.setValidRange(10, Integer.MAX_VALUE); addField(buildCount); + IntegerFieldEditor updateDelay = new IntegerFieldEditor(PREF_BUILDCONSOLE_UPDATE_DELAY_MS, + CUIPlugin.getResourceString("ConsolePreferencePage.consoleUpdateDelay.label"), parent); //$NON-NLS-1$ + updateDelay.getLabelControl(parent).setToolTipText(CUIPlugin.getResourceString("ConsolePreferencePage.consoleUpdateDelay.tooltip")); //$NON-NLS-1$ + updateDelay.getTextControl(parent).setToolTipText(CUIPlugin.getResourceString("ConsolePreferencePage.consoleUpdateDelay.tooltip")); //$NON-NLS-1$ + updateDelay.setErrorMessage(CUIPlugin.getResourceString("ConsolePreferencePage.consoleUpdateDelay.errorMessage")); //$NON-NLS-1$ + updateDelay.setValidRange(0, Integer.MAX_VALUE); + addField(updateDelay); + IntegerFieldEditor tabSize = new IntegerFieldEditor(PREF_BUILDCONSOLE_TAB_WIDTH, CUIPlugin.getResourceString("ConsolePreferencePage.tabWidth.label"), parent); //$NON-NLS-1$ addField(tabSize); @@ -155,6 +180,10 @@ public class BuildConsolePreferencePage extends FieldEditorPreferencePage implem public static int buildConsoleLines() { return CUIPlugin.getDefault().getPreferenceStore().getInt(PREF_BUILDCONSOLE_LINES); } + + public static int buildConsoleUpdateDelayMs() { + return CUIPlugin.getDefault().getPreferenceStore().getInt(PREF_BUILDCONSOLE_UPDATE_DELAY_MS); + } @Override public void init(IWorkbench workbench) { @@ -171,6 +200,8 @@ public class BuildConsolePreferencePage extends FieldEditorPreferencePage implem prefs.setDefault(PREF_BUILDCONSOLE_WRAP_LINES, false); if(!prefs.contains(PREF_BUILDCONSOLE_LINES)) prefs.setDefault(PREF_BUILDCONSOLE_LINES, 500); + if(!prefs.contains(PREF_BUILDCONSOLE_UPDATE_DELAY_MS)) + prefs.setDefault(PREF_BUILDCONSOLE_UPDATE_DELAY_MS, DEFAULT_BUILDCONSOLE_UPDATE_DELAY_MS); if(!prefs.contains(PREF_BUILDCONSOLE_TAB_WIDTH)) prefs.setDefault(PREF_BUILDCONSOLE_TAB_WIDTH, 4); if(!prefs.contains(PREF_BUILDCONSOLE_OUTPUT_COLOR))