Results 1 to 6 of 6
- 05-07-2011, 04:21 PM #1
SwingWorker background task pause
I have successfully implemented a swingWorker to process a very long task in the background in my GUI. I have a button that allows the user to abort the process while it is running and that works fine. However, I would also like to add a button for the user to be able to temporarily suspend the background task and then continue. When I do that, the task gets suspended forever in the "while (pauseProcessing || abortProcessing)" loop and cannot be restarted again. Here is how I implemented it:
If this method for temporarily suspending the background task is incorrect, what is the correct method?Java Code:// The SwingWorker class private class ProcessFile extends SwingWorker<Boolean, Void> { @Override public Boolean doInBackground() { return processFileList(); } @Override protected void done() { try { if (this.get()) statusBar.setText("done"); else statuBar.setText("error"); } catch (Exception e) { statusBar.setText("error while processing"); } } } // The background task private boolean processFileList() { for (int i = 0; i < numofFiles; ++i) { while (pauseProcessing || abortProcessing) { if (abortProcessing) { errCode = errorCodes.errProcessAborted; return false; } } lots more processing here... } return true; } // Button listeners private void abortButtonActionPerformed(java.awt.event.ActionEvent evt) { if (dirList != null) abortProcessing = true; } private void pauseButtonActionPerformed(java.awt.event.ActionEvent evt) { pauseProcessing = !pauseProcessing; }
-
<Sorry -- never mind previous post: bad advice!>
Better advice: create an SSCCE.Last edited by Fubarable; 05-07-2011 at 04:30 PM.
- 05-07-2011, 04:32 PM #3
I'm not sure I understand. Can you show me?
-
Does your pause while loop have a short Thread.sleep in it? It should else it will tie up your app. Found this out in my SSCCE:
Java Code:import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class SimplePauseProcessing extends JPanel { private static final int INDEX_MAX = 100; private static final long SLEEP_DELAY = 500; private JButton startProcessingBtn = new JButton("Start"); private JToggleButton pauseProcessingBtn = new JToggleButton("Pause"); private JButton endProcessingBtn = new JButton("End"); private boolean abortProcessing; private boolean pauseProcessing; private MySwingWorker mySwingWorker; public SimplePauseProcessing() { add(startProcessingBtn); add(pauseProcessingBtn); add(endProcessingBtn); pauseProcessingBtn.setEnabled(false); endProcessingBtn.setEnabled(false); startProcessingBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { startProcessingActionPerformed(); } }); endProcessingBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { endProcessingActionPerformed(); } }); pauseProcessingBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pauseProcessingActionPerformed(); } }); } private void startProcessingActionPerformed() { abortProcessing = false; pauseProcessing = false; new MySwingWorker().execute(); startProcessingBtn.setEnabled(false); endProcessingBtn.setEnabled(true); pauseProcessingBtn.setEnabled(true); pauseProcessingBtn.setSelected(false); } private void endProcessingActionPerformed() { abortProcessing = true; startProcessingBtn.setEnabled(true); endProcessingBtn.setEnabled(false); pauseProcessingBtn.setEnabled(false); pauseProcessingBtn.setSelected(false); } private void pauseProcessingActionPerformed() { pauseProcessing = pauseProcessingBtn.isSelected(); } public boolean backGroundTask() { for (int i = 0; i < INDEX_MAX; i++) { System.out.println("Index: " + i); try { Thread.sleep(SLEEP_DELAY); } catch (InterruptedException e) {} if (abortProcessing) { return false; } while (pauseProcessing) { try { Thread.sleep(50); // [color="red"]***** need this !!! *****[/color] if (abortProcessing) { return false; } } catch (InterruptedException e) {} } } return true; } private class MySwingWorker extends SwingWorker<Boolean, Void> { @Override protected Boolean doInBackground() throws Exception { return backGroundTask(); } @Override protected void done() { startProcessingBtn.setEnabled(true); pauseProcessingBtn.setEnabled(false); endProcessingBtn.setEnabled(false); } } private static void createAndShowUI() { JFrame frame = new JFrame("SimplePauseProcessing"); frame.getContentPane().add(new SimplePauseProcessing()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } }
- 05-07-2011, 05:07 PM #5
Ah did not think of that! That worked! Thanks a heap!
-
Similar Threads
-
SwingWorker
By 3.14.TR in forum Threads and SynchronizationReplies: 3Last Post: 03-14-2011, 04:53 PM -
Using SwingWorker
By viking90 in forum New To JavaReplies: 1Last Post: 04-24-2010, 09:17 AM -
How to pause
By ravjot28 in forum Threads and SynchronizationReplies: 0Last Post: 03-31-2010, 06:09 AM -
Help with Pause
By trill in forum Java AppletsReplies: 2Last Post: 09-28-2007, 08:50 PM -
swingworker
By musiigedeo in forum AWT / SwingReplies: 1Last Post: 07-26-2007, 12:59 PM


LinkBack URL
About LinkBacks
Reply With Quote

Bookmarks