<div dir="ltr">Hello,<br><br>Wouldn't it be better to implement this check in assert to avoid any impact in production?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">пн, 5 авг. 2024 г. в 03:30, John Hendrikx <<a href="mailto:john.hendrikx@gmail.com">john.hendrikx@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi list,<br>
<br>
I know of quite some bugs and users that have been bitten by the <br>
threading model used by JavaFX.  Basically, anything directly or <br>
indirectly linked to an active Scene must be accessed on the FX thread.  <br>
However, as FX also allows manipulating nodes and properties before <br>
they're displayed, there can be no "hard" check everywhere to ensure we <br>
are on the FX thread (specifically, in properties).<br>
<br>
Now, I think this situation is annoying, as a simple mistake where a <br>
Platform.runLater wrapper was forgotten usually results in programs <br>
operating mostly flawlessly, but then fail in mysterious and random and <br>
hard to reproduce ways.  The blame is often put on FX as the resulting <br>
exceptions will almost never show the user code which was the actual <br>
culprit.  It can result in FX being perceived as unstable or buggy.<br>
<br>
So I've been thinking if there isn't something we can do to detect these <br>
bugs originating from user code much earlier, similar to the <br>
`ConcurrentModificationException` the collection classes do when <br>
accessed in nested or concurrent contexts.<br>
<br>
I think it may be possible to have properties check whether they're part <br>
of an active scene without too much of an performance impact, possibly <br>
even behind a switch. It would work like this:<br>
<br>
Properties involved with Nodes will have an associated bean instance <br>
(`getBean`).  This is an object, but we could check here if this <br>
instance implements an interface:<br>
<br>
      if (getBean() instanceof MayBePartOfSceneGraph x) {<br>
            if (x.isPartOfActiveScene() && !isOnFxThread()) {<br>
                 throw new IllegalStateException("Property must only be <br>
used from the FX Application Thread");<br>
            }<br>
      }<br>
<br>
This check could be done on every set of the property, and potentially <br>
on every get as well.  It should be relatively cheap, but will expose <br>
problematic code patterns at a much earlier stage.  There's a chance <br>
that this will "break" some programs that seemed to be behaving <br>
correctly as well, so we may want to put it behind a switch until such <br>
programs (or libraries) can be fixed.<br>
<br>
What do you all think?<br>
<br>
--John<br>
<br>
(*) Names of methods/interfaces are only used for illustration purposes, <br>
we can think of good names if this moves forward.<br>
<br>
</blockquote></div>