From ad4d91708d24accf3936ef13bce89358cc868d10 Mon Sep 17 00:00:00 2001 From: xfarrow Date: Mon, 24 Jul 2023 15:08:10 +0200 Subject: [PATCH] Improvements 1) The Queue does not get updated each time a chunk of data gets transferred, but only after a certain amount of time has passed (1/100th of a second) 2) Improved desktop's scroll behaviour --- Guify/src/controllers/QueueController.java | 24 ++++++++---- Guify/src/views/Desktop.java | 1 + Guify/src/views/Queue.java | 45 +++++++--------------- 3 files changed, 30 insertions(+), 40 deletions(-) diff --git a/Guify/src/controllers/QueueController.java b/Guify/src/controllers/QueueController.java index 4308411..2f3c53b 100644 --- a/Guify/src/controllers/QueueController.java +++ b/Guify/src/controllers/QueueController.java @@ -18,8 +18,10 @@ public class QueueController implements Observer{ */ private IQueueFrame frame; + // Accessed only through the EDT, so no need to use ConcurrentHashMap private HashMap indexHashMap = new HashMap<>(); - + private long lastGuiExecutionTime = 0; + private static final long THROTTLE_TIME_MS = 10; // 10ms = 1/100th of second /* * ========== END Attributes ========== */ @@ -47,16 +49,22 @@ public class QueueController implements Observer{ } } - // Executed by different threads + // Executed on different threads @Override public void update(Observable o, Object arg) { TransferProgress transferProgress = (TransferProgress)arg; - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - frame.manageTransferProgress(transferProgress); - } - }); + + // Do not invoke the Event Dispatch Thread too frequently as + // it may impact the performance of low-end computer systems. + if(System.currentTimeMillis() - lastGuiExecutionTime >= THROTTLE_TIME_MS || transferProgress.getTransferStatus() == TransferProgress.END) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + frame.manageTransferProgress(transferProgress); + lastGuiExecutionTime = System.currentTimeMillis(); + } + }); + } } public int computePercentage(TransferProgress transferProgress) { diff --git a/Guify/src/views/Desktop.java b/Guify/src/views/Desktop.java index 6673423..3906676 100644 --- a/Guify/src/views/Desktop.java +++ b/Guify/src/views/Desktop.java @@ -98,6 +98,7 @@ public class Desktop extends JFrame implements IDesktopFrame { JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(156, 36, 1098, 634); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + scrollPane.getVerticalScrollBar().setUnitIncrement(25); getContentPane().add(scrollPane); desktopPanel = new JPanel(); diff --git a/Guify/src/views/Queue.java b/Guify/src/views/Queue.java index 7991df7..9ba1e22 100644 --- a/Guify/src/views/Queue.java +++ b/Guify/src/views/Queue.java @@ -91,41 +91,22 @@ public class Queue extends JFrame implements IQueueFrame { @Override public void manageTransferProgress(TransferProgress transferProgress) { - if(transferProgress.getTransferStatus() == TransferProgress.INIT) { - if(!controller.isTransferProgressInHashMap(transferProgress)) { - controller.putTableIndex(transferProgress, - addRow(transferProgress.getSource(), - transferProgress.getDestination(), - transferProgress.getOperation() == SftpProgressMonitor.GET? "Download" : "Upload", - 0)); - } - } + // Remember that when QueueController calls frame.manageTransferProgress(transferProgress), + // here transferProgress might have a different status (as it's updated by a different thread). + // We do not need a lock as we do not edit it, but just keep it in mind. - else if(transferProgress.getTransferStatus() == TransferProgress.UPDATING) { - if(!controller.isTransferProgressInHashMap(transferProgress)) { - controller.putTableIndex(transferProgress, - addRow(transferProgress.getSource(), - transferProgress.getDestination(), - transferProgress.getOperation() == SftpProgressMonitor.GET? "Download" : "Upload", - controller.computePercentage(transferProgress))); - } - else { + if(!controller.isTransferProgressInHashMap(transferProgress)) { + controller.putTableIndex(transferProgress, + addRow(transferProgress.getSource(), + transferProgress.getDestination(), + transferProgress.getOperation() == SftpProgressMonitor.GET? "Download" : "Upload", + controller.computePercentage(transferProgress))); + } + else { + if(transferProgress.getTransferStatus() != TransferProgress.INIT) { updateRow(controller.getTableIndex(transferProgress), controller.computePercentage(transferProgress)); } + } - - else if(transferProgress.getTransferStatus() == TransferProgress.END) { - if(!controller.isTransferProgressInHashMap(transferProgress)) { - controller.putTableIndex(transferProgress, - addRow(transferProgress.getSource(), - transferProgress.getDestination(), - transferProgress.getOperation() == SftpProgressMonitor.GET? "Download" : "Upload", - 100)); - } - else { - updateRow(controller.getTableIndex(transferProgress), 100); - } - } - } }