aspose file tools*
The moose likes Swing / AWT / SWT and the fly likes Updates to Java GUI when Running UNIX Shell Script Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Spring in Action this week in the Spring forum!
JavaRanch » Java Forums » Java » Swing / AWT / SWT
Bookmark "Updates to Java GUI when Running UNIX Shell Script " Watch "Updates to Java GUI when Running UNIX Shell Script " New topic
Author

Updates to Java GUI when Running UNIX Shell Script

Manuel Farias Hernandez
Greenhorn

Joined: Jul 07, 2004
Posts: 8
I am writing a kind of install wizard, that I have named JInstall. This JInstall calls a UNIX shell script named install. This script, is the real installation program, and my JInstall is just a nice front end that gathers settings from the user, presents the License.txt file, etc. My JInstall extends JFrame, and uses several JPanels together with a CardLayout Manager to handle the different pages that the user has to go through, for example, a License Agreement Page, Directory Selection Page, and so on.

In the Install Page, I want to display the output from the install shell script in a JTextArea. My problem is that, the output from the shell script install is not simultaneously displayed as the install script runs. All the output is displayed when the script ends, and the scripts takes 1 - 2 minutes to run. Thus, my Java application seams to hang when the user clicks the Install button (a JButton ...).

Please note that my call of the install shell script, is done through the following steps:

runInstallShellScript() {
cardLayout.show( cardPanel, "Install" );
SwingUtilities.invokeLater( this ); // To let the GUI be updated.
}

public void run() {
// Run the install script
}

The use of SwingUtilities.invokeLater is needed, as previously, the updates to the GUI did hang while the install script run. Now, the Install Page is displayed, and then starts the shell script.

So, thus somebody know what I should do? Maybe, there is a complete different approach to have when creating Java-GUI-shell-script-application.
Joe Ess
Bartender

Joined: Oct 29, 2001
Posts: 8927
    
    9

You didn't post nearly enough code to tell you for sure, but I can make some educated guesses. It sounds like a typical Swing threading issue. Which thread invokes the method run()? If you are invoking it from your install button action handler? If so you are hogging the Swing event thread and preventing updates. Do you invoke Process.waitFor()? That method blocks until the new process finishes and would also prevent GUI updates. You probably need to start 3 threads: one to spawn the new process and wait for it to finish and two threads to read from the output and error streams. Those streams have fixed-size buffers and if you don't clear them they can fill and prevent your process from completing. The swing event thread would then be free to make updates to the gui.


"blabbing like a narcissistic fool with a superiority complex" ~ N.A.
[How To Ask Questions On JavaRanch]
Ernest Friedman-Hill
author and iconoclast
Marshal

Joined: Jul 08, 2003
Posts: 24187
    
  34

Manuel --



This is precisely what you don't want to do. By using SwingUtilities.invokeLater(), you're specifically arranging for the install script to be run on the GUI thread, which blocks painting. You want the install script to run on another thread altogether.

Most likely you'd like to have a button press trigger the installation. What that button press should do would look something like



i.e., create a new Thread in which to run the installation, point it at the run() method in "this" object, and start it.

I'm moving this thread to the Swing/AWT forum, as (as Joe says) this is a typical Swing threading question and has nothing to do with Linux/UNIX.
[ July 12, 2004: Message edited by: Ernest Friedman-Hill ]

[Jess in Action][AskingGoodQuestions]
Manuel Farias Hernandez
Greenhorn

Joined: Jul 07, 2004
Posts: 8
Hi folks! I am back!

Yes, I have been off, but now I have returned to the world of Java. I spend 2 hours to fresch up my mind, and to test the suggested solution. So I made a new prototype, and, yes, it functions! Thanks thanks thanks!

Now, I have another problem ... but that might be a new issue/topic.

Best regards,
Manuel
 
It is sorta covered in the JavaRanch Style Guide.
 
subject: Updates to Java GUI when Running UNIX Shell Script