Progress Bar startet zu "spät"

Status
Nicht offen für weitere Antworten.
A

Andi K

Gast
Hab mich daran gemacht eine ProgressBar für mein Programm zu erstellen und eigentlich auch darauf geachtet, dass die Methoden, die die Werte der ProgressBar berechnen als separater Thread ausgeführt werden und Methoden, die die ProgressBar erstellen bzw. den Progressbalken verändern syncExec() aufrufen.

Trotzdem muss sich wohl ein Fehler eingeschlichen haben, denn die ProgressBar, die eigentlich parallel zur Methode laufen soll, wegen der ich sie eigentlich erstellt habe, startet erst, nachdem die Methode abgearbeitet wurde.

Vielen Dank im Voraus!

Code:
//Hier starten die Methodenaufrufe für die ProgressBar und die Methode für die die ProgressBar "benötigt" wird
controller.initProgress(getParent());
controller.initStat(T_input.getText());

//initialisiert die ProgressBar
public void initProgress(Shell parent) {
		DemoProgressBar dpb = new DemoProgressBar(parent);
		dpb.createContents();
		Thread t = new Thread(dpb);
		t.start();
		}

//hier wird die ProgressBar initialisiert
public class DemoProgressBar extends ProgressBarDialog{
	
	private String[] info = null;
	
	public DemoProgressBar(Shell parent) {
       super(parent);
   }
	
	
	public void createContents(){
		super.createContents();
	}
	public void run(){
		initGauge();
		open();
		
	}
	@Override
	public void initGauge() {
		info = new String[100];
		for (int i = 0; i < info.length; i++) {
			info[i] = "process task " + i + ".";
		}
		this.setExecuteTime(100);
		this.setMayCancel(true);
		this.setProcessMessage("please waiting....");
		this.setShellTitle("Demo");

	}

	@Override
	public String process(int arg0) {
		try{
			Thread.sleep((long)(Math.random() * 300));
		}catch(Exception e){e.printStackTrace();}
		
		return info[arg0 - 1];
	}

}




public abstract class ProgressBarDialog extends Dialog implements Runnable{

    private Label processMessageLabel; //info of process finish 
    private Button cancelButton; //cancel button
    private Composite cancelComposite;
    private Label lineLabel;//
    private Composite progressBarComposite;//
    private CLabel message;//
    private ProgressBar progressBar = null; //

    private Object result; //
    private Shell shell; //
    private Display display = null; 
    
    protected volatile boolean isClosed = false;//closed state
    
    protected int executeTime = 50;//process times
    protected String processMessage = "process......";//procress info
    protected String shellTitle = "Progress..."; //
    //protected Image processImage = SWTUtil.getImageOfMessage();//image
    protected boolean mayCancel = true; //cancel
    protected int processBarStyle = SWT.SMOOTH; //process bar style

    public abstract void run();

	public void setMayCancel(boolean mayCancel) {
		this.mayCancel = mayCancel;
	}

    public void setExecuteTime(int executeTime) {
        this.executeTime = executeTime;
    }

    /*public void setProcessImage(Image processImage) {
		this.processImage = processImage;
	}*/

	public void setProcessMessage(String processInfo) {
		this.processMessage = processInfo;
	}

	public ProgressBarDialog(Shell parent) {
        super(parent);
    }
    
	
    public abstract void initGauge();

    public Object open() {
       
    	display.asyncExec(new Runnable() {
            public void run() {
              shell.open();
              shell.layout();
            }
        });
        
        
        //start work
        new ProcessThread(executeTime).start();
        
        display.asyncExec(new Runnable() {
        	public void run() {
        		 Display display = getParent().getDisplay();
        	        while (!shell.isDisposed()) {
        	            if (!display.readAndDispatch()) {
        	                display.sleep();
        	            }
        	        }
        	}
        });
       
        return result;
    }

    public void createContents() {
        shell = new Shell(getParent(), SWT.TITLE | SWT.PRIMARY_MODAL);
        display = shell.getDisplay();
        display.syncExec(new Runnable() {
        	public void run() {
        final GridLayout gridLayout = new GridLayout();
        gridLayout.verticalSpacing = 10;

        shell.setLayout(gridLayout);
        shell.setSize(483, 181);
        shell.setText(shellTitle);

        final Composite composite = new Composite(shell, SWT.NONE);
        composite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
        composite.setLayout(new GridLayout());

        message = new CLabel(composite, SWT.NONE);
        //message.setImage(processImage);
        message.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
        message.setText(processMessage);

        progressBarComposite = new Composite(shell, SWT.NONE);
        progressBarComposite.setLayoutData(new GridData(GridData.FILL,
                GridData.CENTER, false, false));
        progressBarComposite.setLayout(new FillLayout());

        progressBar = new ProgressBar(progressBarComposite, processBarStyle);
        progressBar.setMaximum(executeTime);

        processMessageLabel = new Label(shell, SWT.NONE);
        processMessageLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
        lineLabel = new Label(shell, SWT.HORIZONTAL | SWT.SEPARATOR);
        lineLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));

        cancelComposite = new Composite(shell, SWT.NONE);
        cancelComposite.setLayoutData(new GridData(GridData.END,
                GridData.CENTER, false, false));
        final GridLayout gridLayout_1 = new GridLayout();
        gridLayout_1.numColumns = 2;
        cancelComposite.setLayout(gridLayout_1);

        cancelButton = new Button(cancelComposite, SWT.NONE);
        cancelButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                isClosed = true;
                //System.out.println(isClosed);
            }
        });
        cancelButton.setLayoutData(new GridData(78, SWT.DEFAULT));
        cancelButton.setText("Close");
        cancelButton.setEnabled(true);
        
        	}
        });
    }

    public abstract String process(int times);


    public void cleanUp()
    {
    	
    }
    

    public void doBefore()
    {
    	
    }
    
    public void doAfter()
    {
    	
    }

    class ProcessThread extends Thread {
        private int max = 0;
        private volatile boolean shouldStop = false;

        ProcessThread(int max) {
            this.max = max;
        }

        public void run() {
        	doBefore();
            for (final int[] i = new int[] {1}; i[0] <= max; i[0]++) 
            {
                //
                final String info = process(i[0]);
                if (display.isDisposed()) {
                    return;
                }
                display.syncExec(new Runnable() {
                    public void run() {
                        if (progressBar.isDisposed()) {
                            return;
                        }
                        //
                        processMessageLabel.setText(info);
                        //
                        progressBar.setSelection(i[0]);
                        //
                        if (i[0] == max || isClosed) {
                            if (isClosed) {
                                shouldStop = true;//
                                cleanUp();//
                            }
                            shell.close();//
                        }
                    }
                });

                if (shouldStop) {
                    break;
                }
            }
            doAfter();
        }
    }

	public void setShellTitle(String shellTitle) {
		this.shellTitle = shellTitle;
	}

	public void setProcessBarStyle(boolean pStyle) {
		if(pStyle)
			this.processBarStyle = SWT.SMOOTH;
		else
			this.processBarStyle = SWT.NONE;
			
	}
}
 
S

SlaterB

Gast
tja, was soll man dazu sagen,
du meinst dass du alles richtig gemacht hast, aber es geht trotzdem nicht,
Schlussfolgerung: du hast doch nicht alles richtig gemacht,

willst du über das Problem noch weiter diskutieren oder war das nur eine Art Bekanntmachung? ;)
dein Code hat mit dem Problem übrigens wenig zu tun,

um eine ProgressBar erfolgreich zu demonstrieren braucht es nicht mehr als 50 Zeilen,
was sonst in deinem Programm passiert kann damit doch nix zu tun haben,
allein schon Vererbung von allgemeinem Dialog und aktuellen,
dazu jede Menge Layout, unbekannte Klassen usw.

selber ProgressBar selber ist eine zumindest mir nicht bekannte Klasse ;)



edit: aha, SWT steht ja auch irgendwo ganz klein,
dann würde selbst ein richtiges Testprogramm zumindest mir nicht helfen, hoffentlich aber anderen
 

Leroy42

Top Contributor
Mal was ganz anderes (oder auch nicht).
Code:
 for (final int[] i = new int[] {1}; i[0] <= max; i[0]++) 
            { 
                // 
                final String info = process(i[0]); 
                if (display.isDisposed()) { 
                    return; 
                } 
                display.syncExec(new Runnable() { 
                    public void run() { 
                        if (progressBar.isDisposed()) { 
                            return; 
                        } 
                        // 
                        processMessageLabel.setText(info); 
                        // 
                        progressBar.setSelection(i[0]); 
                        // 
                        if (i[0] == max || isClosed) { 
                            if (isClosed) { 
                                shouldStop = true;// 
                                cleanUp();// 
                            } 
                            shell.close();// 
                        } 
                    } 
                });

Du versuchst hier die Einschränkung, daß Methoden von inneren Klassen
nur auf finale Variablen der deklarierenden Methode zugreifen können,
zu umgehen indem du deine Integer-Variable in ein Array kapselst.

Netter Versuch! :cool:

Klappt so aber leider nicht. Die Werte des gekapselten ints werden
nicht in die in der Schleife erzeugten Runnables gerettet.
(Ginge dies, wäre die Restriktion ja selbst ziemlich hirni).

Deine i[0] in den Runnables habern immer einundenselben Wert,
nämlich max+1 :cool:
 
A

Andi K

Gast
SlaterB hat gesagt.:
tja, was soll man dazu sagen,
du meinst dass du alles richtig gemacht hast, aber es geht trotzdem nicht,
Schlussfolgerung: du hast doch nicht alles richtig gemacht,

willst du über das Problem noch weiter diskutieren oder war das nur eine Art Bekanntmachung? ;)
dein Code hat mit dem Problem übrigens wenig zu tun,

um eine ProgressBar erfolgreich zu demonstrieren braucht es nicht mehr als 50 Zeilen,
was sonst in deinem Programm passiert kann damit doch nix zu tun haben,
allein schon Vererbung von allgemeinem Dialog und aktuellen,
dazu jede Menge Layout, unbekannte Klassen usw.

selber ProgressBar selber ist eine zumindest mir nicht bekannte Klasse ;)



edit: aha, SWT steht ja auch irgendwo ganz klein,
dann würde selbst ein richtiges Testprogramm zumindest mir nicht helfen, hoffentlich aber anderen

@slaterb
Was soll ich auf so eine konstruktive Kritik antworten?
Zum Beispiel dass mein Beitrag im SWT Board geschrieben wurde und es deshalb klar sein sollte, dass ich SWT verwende.

Warum sollte das Code-Stück wenig mit dem Problem zu tun haben? Die Progressbar wird erstellt und gestartet...

---------------

Das Problem ist jedefalls nicht, dass die Progressbar nicht erstellt wird, sondern dass der Prozess erst gestartet wird nachdem
Code:
controller.initStat(T_input.getText());
abgearbeitet wurde.
 

Leroy42

Top Contributor
Deine Codezeilen
Code:
controller.initProgress(getParent()); 
controller.initStat(T_input.getText());

stehen außerhalb jeder Methode :shock:
Wo werden diese denn aufgerufen? ???:L

BTW: Hast du mein Post bzgl. deiner int-Kapselung gelesen?
 
S

SlaterB

Gast
Andi K hat gesagt.:
Was soll ich auf so eine konstruktive Kritik antworten?
Zum Beispiel dass mein Beitrag im SWT Board geschrieben wurde und es deshalb klar sein sollte, dass ich SWT verwende.
das ist kein SWT-Board, die deutliche Mehrheit der Threads ist selbstverständlich zu AWT + Swing ;)
die wenigen SWT-Threads haben meist irgendwelche SWT-Begriffe im Titel, sind deutlich erkennbar (so sollte es sein)

auf meine konstruktive Kritik ist eine Antwort gar nicht nötig sondern eine entschlossene Umsetzung,
wenn ich allein sehe was Leroy42 da aus deinem riesigen Code ausgegraben hat,
dann fällt mir ja gleich nix mehr ein,

mache ein einfaches Vorgehen:
eine minimale ProgressBar von vielleicht 20 Zeilen in einem Testprogramm von 50 Zeilen,
wenn das nicht geht -> hier posten, dann wird der Fehler schnell gefunden,

wenn das geht -> nach und nach deine restlichen 200 bis Abertausend Zeilen einbauen bis du irgendwann merkst,
bei welcher einen Zeile es nicht mehr geht,

dies ist ein narrensicheres Vorgehen zur Fehlersuche, dies war der Inhalt meiner konstruktiven Kritik,
nur etwas peppiger formuliert, immer das gleiche Schreiben nervt auf die Dauer
 

Leroy42

Top Contributor
SlaterB hat gesagt.:
wenn das geht -> nach und nach deine restlichen 200 bis Abertausend Zeilen einbauen bis du irgendwann merkst,
bei welcher einen Zeile es nicht mehr geht,

Aha! Du verwendest also Bottum==>Up Fehlereinkreisung. :shock:
Ich meistens Top==>Down (reduzieren bis der Fehler nicht mehr auftritt). :shock:

Naja, beides ist ok; es führen eben viele Wege nach ... :D
 
S

SlaterB

Gast
nene, das mache ich wohl auch eher so, es sei denn bei ganz hartnäckigen Fällen ;)

aber ich gehe halt immer von dem aus, was gepostet wird,
und dann muss man sagen: Bottom = wenig Code wäre zunächst besser ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards Progress Indication AWT, Swing, JavaFX & SWT 1
N JDialog als Progress-Anzeige AWT, Swing, JavaFX & SWT 6
B SWT Progress-MessageBox AWT, Swing, JavaFX & SWT 2
D Audio Player Progress Slider nicht flüssig AWT, Swing, JavaFX & SWT 2
E Progress Bar mit Bild als Hintergrund AWT, Swing, JavaFX & SWT 2
F splash screen mit progress bar - probleme mit invoke later AWT, Swing, JavaFX & SWT 7
S Progress Monitor mit einer Methode() verbinden AWT, Swing, JavaFX & SWT 4
izoards Jar startet jedoch ohne Hintergrundfunktion AWT, Swing, JavaFX & SWT 25
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
W Swing GUI startet nicht AWT, Swing, JavaFX & SWT 3
P Swing Warum startet das Programm nicht? AWT, Swing, JavaFX & SWT 3
N Applikation startet nicht AWT, Swing, JavaFX & SWT 2
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
G .jar startet nicht nach Exportierung AWT, Swing, JavaFX & SWT 7
V JavaFX SceneBuilder startet nicht AWT, Swing, JavaFX & SWT 18
A Applet Applet startet nicht AWT, Swing, JavaFX & SWT 2
S JDialog startet immer wieder neu AWT, Swing, JavaFX & SWT 2
T Wer startet den EDT? AWT, Swing, JavaFX & SWT 4
T [Applet] startet in Eclipse aber nicht im Browser AWT, Swing, JavaFX & SWT 2
I Wann genau startet der AWT-Thread? AWT, Swing, JavaFX & SWT 3
G Wie startet man ein Applet ? AWT, Swing, JavaFX & SWT 4
H Animation startet nicht/ Thread AWT, Swing, JavaFX & SWT 6
N Swing startet nicht - java.lang.NoSuchMethodError: main AWT, Swing, JavaFX & SWT 8
frau-u JFileChooser startet nicht AWT, Swing, JavaFX & SWT 2
Z GUI: Knöpfe erscheinen spät, Etiketten gar nicht AWT, Swing, JavaFX & SWT 3
M SWT Scrollbalken kommt zu spät AWT, Swing, JavaFX & SWT 5
A Swing TableCellRenderer ändert die Zeilenfarbe zu spät AWT, Swing, JavaFX & SWT 3
T setVisible()-Aufrufe werden zu spät umgesetzt AWT, Swing, JavaFX & SWT 6
A GlassPane wird zu spät angezeigt AWT, Swing, JavaFX & SWT 2
M GUI wird zu spät aufgebaut AWT, Swing, JavaFX & SWT 6
M JLabel kommt zu spät AWT, Swing, JavaFX & SWT 3
K TableLayout - dynamische Elemente zu spät ge-updated AWT, Swing, JavaFX & SWT 3
P ActionListener - Image ladet zu spät AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben