Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Java
You last visited: Today at 13:50

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement


JavaFXGUI updaten mit mehreren Threads

Discussion on JavaFXGUI updaten mit mehreren Threads within the Java forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
The Black Market: 130/0/4
Join Date: May 2011
Posts: 3,731
Received Thanks: 484
Smile JavaFXGUI updaten mit mehreren Threads

Hallo,
ich habe eine JavaFX-Anwendung am laufen, die ca. 4 Minuten lang arbeitet. Nun möchte ich den User auf dem laufenden halten, was derzeit passiert und habe somit eine neue Form mit Controller erstellt, welche eine TextArea beinhaltet. In dieser TextArea sollen Nachrichten erscheinen, welche ich in der ersten Controller-Klasse an die neue Controller-Klasse übergebe.

Ich weiß, dass dafür ein zweiter Thread nötig ist. Aber ich weiß nicht, wie/wo genau ich den initialisiere und wie ich Nachrichten aus der ersten Klasse an die zweite Klasse (den neuen Thread) übergeben kann.

Vielen Dank im Voraus!
.Dave' is offline  
Old 11/05/2018, 08:16   #2

 
elite*gold: 909
Join Date: Mar 2008
Posts: 2,595
Received Thanks: 1,621
Am besten beim Start der Aufgaben den Thread ebenfalls starten und diesen ein Objekt übergeben mit dem du auf die Textbox zugreifen kannst.

Grüße
Benhero is offline  
Old 11/05/2018, 14:32   #3
 
elite*gold: 0
Join Date: Mar 2013
Posts: 3,187
Received Thanks: 1,316
Schau dir die Klasse Task mal an:

Hierbei Schwerpunkt auf Methode updateMessage(java.lang.String message) und messageProperty().
Du kannst also den Inhalt deiner TextArea an die messageProperty binden und hast das Problem somit ganz elegant gelöst.
Zunft is offline  
Old 11/05/2018, 15:41   #4
 
elite*gold: 0
The Black Market: 130/0/4
Join Date: May 2011
Posts: 3,731
Received Thanks: 484
Quote:
Originally Posted by Zunft View Post
Schau dir die Klasse Task mal an:

Hierbei Schwerpunkt auf Methode updateMessage(java.lang.String message) und messageProperty().
Du kannst also den Inhalt deiner TextArea an die messageProperty binden und hast das Problem somit ganz elegant gelöst.
Das hört sich doch sehr interessant an, danke!
Wie viele Threads kann man theoretisch denn gleichzeitig laufen haben?

1 Thread = 1 Kernel?
.Dave' is offline  
Old 11/05/2018, 15:53   #5
 
elite*gold: 0
Join Date: Mar 2013
Posts: 3,187
Received Thanks: 1,316
Quote:
Originally Posted by .Dave' View Post
Das hört sich doch sehr interessant an, danke!
Wie viele Threads kann man theoretisch denn gleichzeitig laufen haben?

1 Thread = 1 Kernel?
Nein, dem ist nicht so. Du kannst mehrere Tausend Threads erstellen. Eine genaue Zahl zu sagen ist allerdings unmöglich.

Als kleiner Hinweis: Du kannst mit der mit im JDK beigelegten Software Java Mission Control wunderbar ansehen, welche Threads laufen und wie viel Leistung gefressen wird und vieles, vieles mehr. Ein Blick in die Software beim Programmieren lohnt sich.
Zunft is offline  
Old 11/08/2018, 13:18   #6
 
elite*gold: 0
The Black Market: 130/0/4
Join Date: May 2011
Posts: 3,731
Received Thanks: 484
Vielen Dank! Aktuell bin ich zeitlich leider etwas zurück und konnte den Thread-Task-Task noch nicht programmieren. Melde mich aber hier, sofern ich weitere Fragen dazu habe.
.Dave' is offline  
Old 11/08/2018, 15:59   #7
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 572
Zwar wurde hier das wichtige schon erwähnt, aber ich versuche mich dennoch mal an einer genaueren Erklärung.

Aus Threads heraus zeichnet man für gewöhnlich nicht. Es ist zwar sowohl mit OpenGL als auch mit DirectX (welches JavaFX verwendet unter Unix bzw. Windows) möglich von verschiedenen Threads zu zeichnen, aber man sollte genau wissen was man macht. Daher ist die allgemeine Empfehlung für gewöhnlich don't do it.

Daher stellt JavaFX dafür diverse Mechanismen vor, die Funktion runLater und die Task Klasse. runLater registriert ein Runnable objekt in einer Message queue, welches der JavaFX main Thread abbarbeitet sobald er Zeit dafür findet. Jedes runLater wird früher oder später ausgeführt werden (außer du hast nen Deadlock, dann hast du aber noch ganz andere Probleme).
Damit kann man aber auch stark Performance einbüßen, da man die Message Queue von JavaFX flooden kann, da jedes Runnable Objekt ausgeführt wird. Wenn dein Thread also schneller updated als JavaFX zeichnen kann geht das ganz schnell in die Hose gehen (das kann schnell passieren wenn die Threads auf verschiedenen CPU's laufen).

Ein Task hingegen hat einen State (also Informationen wie Progress und Message) welche an Properties gebindet werden können, sodass javaFX, sobald es zeit hat, überprüft ob was neues im Task steht, und dann die gebindete property updated.
Das bedeutet aber auch das alle Änderungen zwischen zwei abfragen nicht beachtet werden. Somit läufst du nicht in die Performance Probleme von runLater.

Ansonsten wenn du zwischen Threads kommunizieren willst (also nicht unbedingt GUI zeichnen) solltest du bevor du auf Daten eines anderen Threads zugreifst unbedingt , oder über den Thread ansteuern

Zu der Anzahl an Threads, die ist durch verschiedene Faktoren limitiert, CPU zahl gehört nicht dazu (vor allem ist Speicher das limitierende Element, mit nur 1 GB RAM kannst du nicht viele Threads haben). Ein moderner 64bit Rechner mit 4GB RAM sollte aber schon ein paar (zehn)Tausend hinbekommen. Mit 1 Thread pro CPU kannst du allerdings die Maximale auslastung ereichen (weniger und nicht alle CPU's sind abgedeckt, mehr und das wechseln zwischen Threads kostet performance). Gleichzeitig sorgt #Threads=#CPU dafür das die Threads nicht zwischendurch auf eine andere CPU geladen werden, was dafür sorgt das die Caches neu geladen werden müssen und daher Zugriffszeiten länger sind.
warfley is offline  
Thanks
2 Users
Reply


Similar Threads Similar Threads
[S]Steam mit Left 4 Dead 2! [B]Steam mit mehreren Spielen!
10/18/2012 - Steam Trading - 0 Replies
Suche auch eGold! Biete Steamaccount mit : COD Black Ops COD Black Ops Multiplayer Counterstrike Source CSS Beta HL 2 DM HL 2 LC



All times are GMT +2. The time now is 13:50.


Powered by vBulletin®
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

BTC: 33E6kMtxYa7dApCFzrS3Jb7U3NrVvo8nsK
ETH: 0xc6ec801B7563A4376751F33b0573308aDa611E05

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2021 elitepvpers All Rights Reserved.