|
Re: Zyklisches Update HTML Tile [message #1834596 is a reply to message #1834574] |
Fri, 13 November 2020 10:12 |
|
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 #1834700 is a reply to message #1834692] |
Mon, 16 November 2020 12:34 |
|
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
|
|
|
|
Powered by
FUDForum. Page generated in 0.02958 seconds