Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: JAVA / Netbeans - Effekt von Thread.sleep(...) ?

19 views
Skip to first unread message
Message has been deleted

Joerg Meier

unread,
Apr 19, 2013, 12:02:04 PM4/19/13
to
On Fri, 19 Apr 2013 17:50:31 +0200, Dirk Schwidde wrote:

> Es müssten doch zuvor die Zahlen 1 bis 9 für jeweils 1000
> Millisekunden im Textfeld sichtbar sein, oder nicht?

Nein. Du gibst Swing ja keine Zeit, irgendwas neu darzustellen. Swing kommt
ja erst wieder zum malen, wenn Dein Loop beendet ist.

> Wie lautet die Erklärung?

Du arbeitest auf dem Swing EDT, das gehoert sich nicht, weil dann genau das
passiert, was Du siehst. Mehr dazu z.B. hier:

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

und hier wie man korrekterweise lange Arbeiten unter Swing ausfuehrt:

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

Liebe Gruesse,
Joerg

--
Ich lese meine Emails nicht, replies to Email bleiben also leider
ungelesen.
Message has been deleted

Joerg Meier

unread,
Apr 19, 2013, 12:50:20 PM4/19/13
to
On Fri, 19 Apr 2013 18:28:36 +0200, Dirk Schwidde wrote:

> On Fri, 19 Apr 2013 18:02:04 +0200, Joerg Meier <joerg...@arcor.de>
> wrote:
>>On Fri, 19 Apr 2013 17:50:31 +0200, Dirk Schwidde wrote:
>>> Es müssten doch zuvor die Zahlen 1 bis 9 für jeweils 1000
>>> Millisekunden im Textfeld sichtbar sein, oder nicht?
>>Nein. Du gibst Swing ja keine Zeit, irgendwas neu darzustellen. Swing kommt
>>ja erst wieder zum malen, wenn Dein Loop beendet ist.
> Ja, danke - hab's jetzt verstanden.

> In http://www.java-forum.org fand ich auch noch diese Aussage:
> der ActionListener muss umgehend beendet werden,
> erst dann wird die GUI wieder gezeichnet

Richtig: ActionListener laufen auf dem Swing EDT, die duerfen also nichts
blockieren oder lange rumeiern. Fuer Faelle wie Deinem also von dem
ActionListener aus einen SwingWorker (oder aehnliches, fuer Threads gibts
ja diverse Optionen) starten, und da dann den Loop laufen lassen.

Aber vorsicht: von anderen Threads aus darfst Du nicht direkt Deine
Swing-Komponenten anfassen. Das mag zwar beim testen gutgehen, fuehrt aber
langfristig zu Problemen. Ersetze also:

txtAusgabe.setText("" + j);

mit (aus dem Gedaechtniss, ich hoffe die Klammern etc. sind jetzt alle
richtig):

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
txtAusgabe.setText("" + j);
}
});

Ja, ganz schoen haesslich, fuehrt aber kein Weg drumrum, wenn Du es richtig
machen willst.
Message has been deleted

Joerg Meier

unread,
Apr 20, 2013, 3:56:24 PM4/20/13
to
On 20 Apr 2013 13:05:02 GMT, Stefan Ram wrote:

> Dirk Schwidde <someword.20....@spamgourmet.com> writes:
>>der ActionListener muss umgehend beendet werden,
>>erst dann wird die GUI wieder gezeichnet
> class Loop extends java.lang.Thread
> { public void run()
> { for( final int j : new int[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 })
> { new Executor(){ public void run()
> { Loop.this.output.setText( java.lang.String.valueOf( j )); }}.start();
> try{ java.lang.Thread.sleep( 1000 ); }
> catch( final java.lang.Exception exception ) {}}
[...]

Danke, jetzt fuehle ich mich nicht mehr so schlecht wegen dem haesslichen
Code, den ich in meinem anderen Post hatte. Nett von Dir ;-)

Mal ehrlich: schreibst Du Deinen Code mit dem expliziten Ziel, dass den
niemand (ausser Dir) lesen kann ? Ich hatte mich ja andernorts schon
letztens gewundert, aber das ist doch jetzt wirklich nicht mehr "ein
anderer Stil" sondern schon eher "obfuscation".

Dietz Proepper

unread,
Apr 21, 2013, 3:31:21 AM4/21/13
to
Joerg Meier wrote:

> On 20 Apr 2013 13:05:02 GMT, Stefan Ram wrote:
>
>> Dirk Schwidde <someword.20....@spamgourmet.com> writes:
>>>der ActionListener muss umgehend beendet werden,
>>>erst dann wird die GUI wieder gezeichnet
>> class Loop extends java.lang.Thread
>> { public void run()
>> { for( final int j : new int[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 })
>> { new Executor(){ public void run()
>> { Loop.this.output.setText( java.lang.String.valueOf( j ));
>> { }}.start();
>> try{ java.lang.Thread.sleep( 1000 ); }
>> catch( final java.lang.Exception exception ) {}}
> [...]
>
> Danke, jetzt fuehle ich mich nicht mehr so schlecht wegen dem haesslichen
> Code, den ich in meinem anderen Post hatte. Nett von Dir ;-)
>
> Mal ehrlich: schreibst Du Deinen Code mit dem expliziten Ziel, dass den
> niemand (ausser Dir) lesen kann ? Ich hatte mich ja andernorts schon
> letztens gewundert, aber das ist doch jetzt wirklich nicht mehr "ein
> anderer Stil" sondern schon eher "obfuscation".

Ein Array zu erzeugen, um eine Schleife zu durchlaufen, *kopfsch�ttel*. Da hat
wohl wer zu viel semantischen Zucker genascht.

Au�erdem ist das Konstrukt beispielsweise auf pasenden dalvik-Versonen recht
ineffizient.
0 new messages