Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » Eclipse Scout » Zyklisches Update HTML Tile
Zyklisches Update HTML Tile [message #1834574] Thu, 12 November 2020 16:27 Go to next message
Christoph Quinten is currently offline Christoph QuintenFriend
Messages: 13
Registered: November 2020
Junior Member
Ich habe eine SummaryForm mit verschiedenen HtmlTiles erstellt.

Nun möchte ich bei einer Kachel innerhalb einer Schleife den Content anpassen und das Ergebnis kontinuierlich anzeigen.

Vereinfacht gesagt ich habe eine Kachel und in einer for-Schleife bis 10000 soll die aktuelle Zahl angezeigt werden.

Der Auslöser zum Start dieser Schleife ist eine ButtonTile. Sobald ich darauf klicke soll die Schleife durchlaufen werden. Hier stoße ich jedoch auf Probleme.

Ich habe es bisher direkt versucht, dann ploppt jedoch das Bitte warten Fenster auf und wenn die Schleife durch ist, steht einfach nur die 10000 als Wert drin.

Mein zweiter Versuch war es mittels Job auszuführen. Hier komme ich zu einem ähnlichen Ergebnis nur das hier nicht Bitte warten auftaucht sondern es kurz dauert und dann einfach 10000 dort steht.

Wie kann ich das Problem umgehen?
Also das mir quasi die Zahl hochgezählt wird und ich dies in der Tile verfolgen kann?

Vielen Dank schon einmal für die Antworten.
Re: Zyklisches Update HTML Tile [message #1834596 is a reply to message #1834574] Fri, 13 November 2020 10:12 Go to previous messageGo to next message
Andre Wegmueller is currently offline Andre WegmuellerFriend
Messages: 204
Registered: September 2012
Location: Baden-Dättwil, Switzerla...
Senior Member
Hallo Christoph

Ich nehme mal an, du baust eine Applikation mit Scout Classic (=Java), richtig?

Wenn du etwas in einer Scout-Komponente machst, z.B. in einer exec* Methode, dann befindest du dich immer in einem Scout-Model Thread. Die Response an das UI im Browser wird erst dann gesendet, wenn dieser Thread endet. Wenn du also einen einfachen Loop machst, wird dieser komplett abgearbeitet und der finale Zustand vom Scout-Widget ans UI gesendet.

Um ein Scout-Widget regelmässig zu Updaten braucht es folgendes:

1. im Scout-Model Thread (z.B. in execInitField oder execAction) einen Hintergrund-Job starten, siehe hier.
2. Der Hintergrund-Job sollte mit einem ExecutionTrigger als Timer gestartet werden, siehe hier.
3. Das Scout-Model darf nur durch den Scout-Model Thread geändert werden, d.h. der Hintergrund-Job muss einen neuen Model-Job starten, um Änderungen am UI zu machen, z.B. um field.setValue(counter) aufzurufen. Ein Code-Beispiel das in die Richtung geht ist hier.

Cheers,
André


Eclipse Scout Homepage | Documentation | GitHub

[Updated on: Fri, 13 November 2020 10:16]

Report message to a moderator

Re: Zyklisches Update HTML Tile [message #1834692 is a reply to message #1834596] Mon, 16 November 2020 08:34 Go to previous messageGo to next message
Christoph Quinten is currently offline Christoph QuintenFriend
Messages: 13
Registered: November 2020
Junior Member
Hallo André,

Genau das stimmt. Die Applikation ist mit Scout Classic gebaut.
Vielen Dank für deine Rückmeldung. Anhand dieser habe ich nun Folgendes gebaut:

1.) in execAction - Methode des Buttons:
MainJob job = new MainJob();
job.setLeftTiles(getLeftTiles());
try {
job.run();
} catch (Exception e) {
e.printStackTrace();
}

###
2.) in der run - Methode() im MainJob:
ModelJobs.schedule(() -> {
for(int i=0; i<100000; i++) {
tile.setContent("" + i);
}
}, ModelJobs.newInput(ClientRunContexts.copyCurrent()));


###
Jedoch läuft die Schleife nun immer noch durch und zeigt mir nur das Endergebnis an (also 99999) und keine Zwischenschritte.

Fehlt hier etwas?
Re: Zyklisches Update HTML Tile [message #1834700 is a reply to message #1834692] Mon, 16 November 2020 12:34 Go to previous messageGo to next message
Andre Wegmueller is currently offline Andre WegmuellerFriend
Messages: 204
Registered: September 2012
Location: Baden-Dättwil, Switzerla...
Senior Member
Ja, jetzt hast du mit mehreren Jobs genau die gleiche Situation gebaut, die du auch schon mit einem einzigen ModelJob zuvor hattest :-)

Wie schon in meiner ersten Antwort gesagt, blockiert ein ModelJob das UI solange bis der ModelJob beendet ist und schickt dann die notwendige Zustandsänderung an der UI-Komponente ans UI. Relevant ist für Scout nur der Zustand der eine Komponente hat, wenn der ModelJob endet.

Deine CPU zählt übrigens sehr schnell von 0 auf 100'000, wenige [ms] genügen dafür. Auch wenn Scout alle Änderungen ans UI übertragen würde, würdest du diese Änderung nicht sehen.

Dein "MainJob" sollte darum als Timer gebaut werden, d.h. ein Job der z.B. alle 1000 [ms] getriggert wird. Jedesmal wenn der MainJob läuft, Scheduled er einen neuen ModelJob. Beispiel:

    private AtomicInteger m_counter = new AtomicInteger(0);

    Jobs.schedule(() -> {

      ModelJobs.schedule(() -> {
        getXyzTile().setContent("" + m_counter.incrementAndGet());
      }, ModelJobs.newInput(ClientRunContexts.copyCurrent()));

    }, Jobs.newInput()
        .withRunContext(RunContexts.copyCurrent())
        .withExecutionTrigger(Jobs.newExecutionTrigger().withSchedule(
            FixedDelayScheduleBuilder.repeatForever(1, TimeUnit.SECONDS)))
        .withName("Background job"));


André


Eclipse Scout Homepage | Documentation | GitHub
Re: Zyklisches Update HTML Tile [message #1834705 is a reply to message #1834700] Mon, 16 November 2020 15:18 Go to previous message
Christoph Quinten is currently offline Christoph QuintenFriend
Messages: 13
Registered: November 2020
Junior Member
Ah ich verstehe.

Super vielen Dank nun funktioniert es.

Gruß,
Christoph
Previous Topic:Error vendor.js when using ChartField
Next Topic:REST authentication
Goto Forum:
  


Current Time: Thu Apr 25 19:58:12 GMT 2024

Powered by FUDForum. Page generated in 0.02958 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top