Announcement

Collapse
No announcement yet.

Asynchrone Messageverarbeitung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Asynchrone Messageverarbeitung

    <B>Hallo zusammmen</b>,<BR>
    ich hab ein ziemlich seltsames Problem, ich habe eine Funktion, die auf ein Actionevent von einem Button reagiert.<BR>
    Die Abarbeitungszeit dieser Funktion dauert einige Sekunden.<BR>
    Um dem Benutzer einen Hinweis zu geben, das das System noch arbeitet, wollte ich ähnlich einer Ampel ein Label einfärben.<BR>
    Am Anfang setzte ich das Label auf rot, dann auf gelb und nach dem die Verarbeitung abgeschlossen ist, auf grün. <BR>Soweit so gut, das Ergebniss ist, das ich NUR das grüne Label bekomme, nie rot oder gelb, auch ein repainten/revalidaten das Labels/Panels bzw. das <B>syncronized</B> dieses Aufrufes hat nicht den gewünschten Erfolg.<BR>
    Kann mir jemand einen Tipp geben, wie ich das Repaint in der zeitlich richtigen! Reihenfolge "erzwingen" kann????

  • #2
    Hallo Mirko,<BR>
    <BR>
    wie stellst Du denn die Synchronität zwischen dem Einfärben des Labels und der Bearbeitung her? Gibt Du die eigentliche Bearbeitung an einen Thread ab? Oder ist es eine "einfache" sequenzielle Methode, in der Du zu Beginn das Label auf rot, mittendrin auf gelb und am Ende auf grün setzt und das Problem besteht darin, daß die Aktualisierung des Labels "lange" nach dem Setzen der Farbe geschieht?
    <BR>
    <BR>
    Stefa

    Comment


    • #3
      Hi Stefan,
      das ganze passiert in einer sequenziellen Funktion. z.B.<BR>
      <PRE>
      protected void jButton1_actionPerformed(ActionEvent e) {
      ps.getMain().setStatusTextLong("Restore wird gestartet");
      ps.getMain().setColorShort(Color.red);

      // do something

      ps.getMain().setStatusTextLong("Restore ist gestartet");
      ps.getMain().setColorShort(Color.green);
      }
      </PRE>

      ich kann die bearbeitung ganz schlecht an einen Thread abgeben, da sehr viele Funktionen betroffen sind.<BR>
      Ich habe schon probiert in den Funktionen setColorShort() etc. ein repaint/revalidate des Labels bzw. des zugeordnetem Panels zu erzwingen<BR>aber interessiert hat ihn das auch nicht
      auch wenn ich die Methode <B>synchronized</B> mache, interessiert ihn das nicht...
      Ich bin mir halt nicht sicher, ob es etwas bringt, die anzeige der Labels in einen Thread zu packen..

      Comment


      • #4
        ich hab noch nen Nachtrag<BR>
        <pre>
        class ColorThread extends Thread {
        Color c1 = null;

        public ColorThread (Color c1) {
        this.c1 = c1;
        }

        public void run() {
        if(c1 != null)
        setColorLong(c1);
        }

        private void setColorLong(Color c) {
        jLabel1.setOpaque(true);
        jLabel1.setBackground(c);
        jLabel1.repaint();
        jLabel1.revalidate();
        }

        }
        </pre><BR>
        und wenn ich dann in meiner eigentlichen Funktion bin: starte ich den Thread wie folgt:<BR>
        <PRE>
        ColorThread cThread = new ColorThread(c);
        // ColorThread starten
        cThread.setPriority(Thread.MAX_PRIORITY);
        cThread.start();
        </PRE>
        <BR>aber auch das führt nicht zu dem gewünschten Ergebniss, das das Label wirklich auf rot umspringt

        :

        Comment


        • #5
          Hallo Mirco,<BR>
          <BR>
          Ich wollte Dich mit meiner Frage nach einem Thread auch gar nicht dazu motivieren, einen zu verwenden. Nur hätte man dann das Problem unter Umständen auch anders angehen müssen. Das Setzen der Farbe in einen eigenen Thread zu verpacken, wird das Problem nicht lösen. Da würde ich an Deiner Stelle drauf verzichten.<BR>
          Vielleicht liegt es am repaint. Denn es ist nicht so, daß sich ein Fenster bei einer Änderung auf jeden Fall sofort neu zeichnet. Es kann durchaus zeitlich verzögert geschehen. Diese möglichen Verzögerungen machen normalerweise aber keine Probleme. Wenn bei Dir die Bearbeitung ein paar Sekunden dauert, müßte das Einfärben schon längst gezeichnet worden sein. Ich kann heute abend etwas ausprobieren und Dir morgen früh vielleicht näheres mitteilen.<BR>
          <BR>
          Stefa

          Comment

          Working...
          X