ASF Bugzilla – Attachment 34738 Details for
Bug 60687
Make GUI more responsive when it gets a lot of events
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Use a bounded fifo buffer for the log events and update LoggerPanel periodically instead of directly
0001-Update-loggerPanel-only-periodically.patch (text/plain), 4.81 KB, created by
Felix Schumacher
on 2017-02-08 11:48:59 UTC
(
hide
)
Description:
Use a bounded fifo buffer for the log events and update LoggerPanel periodically instead of directly
Filename:
MIME Type:
Creator:
Felix Schumacher
Created:
2017-02-08 11:48:59 UTC
Size:
4.81 KB
patch
obsolete
>From 27fa211fd987af23d8e15b4d1e7add8b418af361 Mon Sep 17 00:00:00 2001 >From: Felix Schumacher <felix.schumacher@debeka.de> >Date: Tue, 7 Feb 2017 08:22:48 +0100 >Subject: [PATCH 1/2] Update loggerPanel only periodically. > >--- > src/core/org/apache/jmeter/gui/LoggerPanel.java | 68 +++++++++++++++++++------ > 1 file changed, 53 insertions(+), 15 deletions(-) > >diff --git a/src/core/org/apache/jmeter/gui/LoggerPanel.java b/src/core/org/apache/jmeter/gui/LoggerPanel.java >index 4c77751..f7b4e3d 100644 >--- a/src/core/org/apache/jmeter/gui/LoggerPanel.java >+++ b/src/core/org/apache/jmeter/gui/LoggerPanel.java >@@ -20,13 +20,16 @@ package org.apache.jmeter.gui; > > import java.awt.BorderLayout; > import java.awt.Insets; >+import java.util.Iterator; > > import javax.swing.JPanel; > import javax.swing.JScrollPane; > import javax.swing.JTextArea; > import javax.swing.ScrollPaneConstants; > import javax.swing.SwingUtilities; >+import javax.swing.Timer; > >+import org.apache.commons.collections.buffer.BoundedFifoBuffer; > import org.apache.jmeter.gui.logging.GuiLogEventListener; > import org.apache.jmeter.gui.logging.LogEventObject; > import org.apache.jmeter.gui.util.JSyntaxTextArea; >@@ -45,12 +48,22 @@ public class LoggerPanel extends JPanel implements GuiLogEventListener { > > // Limit length of log content > private static final int LOGGER_PANEL_MAX_LENGTH = >- JMeterUtils.getPropDefault("jmeter.loggerpanel.maxlength", 80000); // $NON-NLS-1$ >- >+ JMeterUtils.getPropDefault("jmeter.loggerpanel.maxlength", 1000); // $NON-NLS-1$ >+ > // Make panel handle event even if closed > private static final boolean LOGGER_PANEL_RECEIVE_WHEN_CLOSED = > JMeterUtils.getPropDefault("jmeter.loggerpanel.enable_when_closed", true); // $NON-NLS-1$ > >+ private static final int LOGGER_PANEL_REFRESH_PERIOD = >+ JMeterUtils.getPropDefault("jmeter.loggerpanel.refresh_period", 500); // $NON-NLS-1$ >+ >+ private final BoundedFifoBuffer events = >+ new BoundedFifoBuffer(LOGGER_PANEL_MAX_LENGTH); // $NON-NLS-1$ >+ >+ private volatile boolean logChanged = false; >+ >+ private Timer timer; >+ > /** > * Pane for display JMeter log file > */ >@@ -84,6 +97,9 @@ public class LoggerPanel extends JPanel implements GuiLogEventListener { > areaScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); > areaScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); > this.add(areaScrollPane, BorderLayout.CENTER); >+ >+ initWorker(); >+ > return jTextArea; > } > >@@ -96,27 +112,49 @@ public class LoggerPanel extends JPanel implements GuiLogEventListener { > return; > } > >- SwingUtilities.invokeLater(new Runnable() { >- @Override >- public void run() { >- synchronized (textArea) { >- textArea.append(logEventObject.toString()); >- int currentLength = textArea.getText().length(); >- // If LOGGER_PANEL_MAX_LENGTH is 0, it means all log events are kept >- if(LOGGER_PANEL_MAX_LENGTH != 0 && currentLength> LOGGER_PANEL_MAX_LENGTH) { >- textArea.setText(textArea.getText().substring(Math.max(0, currentLength-LOGGER_PANEL_MAX_LENGTH), >- currentLength)); >+ String logMessage = logEventObject.toString(); >+ synchronized (events) { >+ if (events.isFull()) { >+ events.remove(); >+ } >+ events.add(logMessage); >+ } >+ >+ logChanged = true; >+ } >+ >+ private void initWorker() { >+ timer = new Timer( >+ LOGGER_PANEL_REFRESH_PERIOD, >+ e -> { >+ if (logChanged) { >+ logChanged = false; >+ StringBuilder builder = new StringBuilder(); >+ synchronized (events) { >+ Iterator<String> lines = events.iterator(); >+ while (lines.hasNext()) { >+ builder.append(lines.next()); >+ } >+ } >+ String logText = builder.toString(); >+ synchronized (textArea) { >+ textArea.setText(logText); >+ int currentLength = logText.length(); >+ textArea.setCaretPosition(logText.length()); > } >- textArea.setCaretPosition(textArea.getText().length()); > } > } >- }); >+ ); >+ timer.start(); > } > > /** > * Clear panel content > */ > public void clear() { >- this.textArea.setText(""); // $NON-NLS-1$ >+ synchronized (events) { >+ events.clear(); >+ } >+ logChanged = true; > } > } >-- >2.10.2 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 60687
:
34714
|
34715
|
34716
|
34717
|
34736
|
34737
| 34738