HEADS-UP: Threading restriction for Animation play, pause, stop now enforced USE CASE
John Hendrikx
john.hendrikx at gmail.com
Mon Jan 22 15:58:20 UTC 2024
This seems like a reasonable use case, and perhaps this was the original
intent of the "asynchronous call" documentation.
The problem though is that the play/stop code does not seem to take into
account being called from a different thread (there are several
synchronization issues when I delved into that code).
So then there's a choice to make I think, either:
- Disallow it completely, and have users wrap it into Platform.runLater()
- Have play/stop do the wrapping itself
- Make the methods thread safe by fixing the synchronization issues
--John
On 22/01/2024 11:59, Jurgen Doll wrote:
> Here's an example as requested by Nir:
>
> publicclassFxTimeLineTest extendsApplication
>
> {
>
> privateBorderPane bp= newBorderPane( newLabel("Loading") );
>
> publicstaticvoidmain( String[] args) {
>
> launch( FxTimeLineTest.class, args);
>
> }
>
> @Override
>
> publicvoidstart( Stage primaryStage) throwsException {
>
> newThread( newLoadScene() ).start();
>
> primaryStage.setScene( newScene( bp, 300, 200 ) );
>
> primaryStage.setTitle( "Memory Usage");
>
> primaryStage.show();
>
> }
>
> privateclassLoadScene extendsTask<Parent> {
>
> @OverrideprotectedParent call() throwsException {
>
> Parent p= FXMLLoader.load( getClass().getResource("TestView.fxml") );
>
> Thread.sleep( 1000 );
>
> returnp;
>
> }
>
> @Overrideprotectedvoidsucceeded() {
>
> bp.setCenter( getValue() );
>
> }
>
> @Overrideprotectedvoidfailed() {
>
> getException().printStackTrace();
>
> }
>
> }
>
> }
>
> ------------------------------------------------------------------------------------------------------
>
>
> publicclassTestView
>
> {
>
> @FXMLprivateLabel memory;
>
> privatestaticfinaldoubleMEGABYTE= 1024 * 1024;
>
> @FXMLprivatevoidinitialize()
>
> {
>
> varupdater= newTimeline
>
> (
>
> newKeyFrame( Duration.seconds(2.5), event->
>
> {
>
> varruntime= Runtime.getRuntime();
>
> doublemaxMemory= runtime.maxMemory() / MEGABYTE;
>
> doubleusedMemory= (runtime.totalMemory() - runtime.freeMemory()) /
> MEGABYTE;
>
> memory.setText( (int) usedMemory+ " MB / "+ (int) maxMemory+" MB");
>
> })
>
> );
>
> updater.setCycleCount(Animation.INDEFINITE); // This FXML is being
> loaded on a background thread
>
> updater.play();
>
> }
>
> }
>
> ------------------------------------------------------------------------------------------------------
>
>
> TestView.fxml
>
> <?xml version="1.0" encoding="UTF-8"?>
>
> <?import javafx.scene.control.Label?>
>
> <?import javafx.scene.layout.StackPane?>
>
> <StackPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="TestView">
>
> <children>
>
> <Label fx:id="memory" text="Current / Max MB" >
>
> <properties hashCode="12345" />
>
> </Label>
>
> </children>
>
> </StackPane>
>
>
>
>
> On Sat, 20 Jan 2024 17:08:41 +0200, Nir Lisker <nlisker at gmail.com> wrote:
>
> Hi Jurgen,
>
> What I'm confused about the most is what it is you are actually
> trying to do that necessitates the use of animations outside of
> the FX thread. You said that you need to initialize controls on
> another thread, and that you are using Task (both of which are
> fine), but how does playing animations relate? Playing an
> animation is something that is done explicitly, usually in order
> to manipulate data. Can you give a real use case, like a minimized
> version of what you're doing?
>
> - Nir
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20240122/a7cb8d39/attachment-0001.htm>
More information about the openjfx-dev
mailing list