En temps réel des graphiques en Java
J'ai une application qui met à jour une variable entre 5 à 50 fois par seconde, et je suis à la recherche d'un moyen de dessin continu XY intrigue de ce changement en temps réel.
Si JFreeChart est pas recommandé pour une haute fréquence de mise à jour, de nombreux utilisateurs continuent de dire qu'il travaille pour eux. J'ai essayé d'utiliser cette démo et l'a modifié pour afficher une variable aléatoire, mais il semble qu'il utilise jusqu'à 100% d'utilisation du PROCESSEUR tout le temps. Même si j'ignore que, je ne veux pas être limité à JFreeChart de l'interface utilisateur de la classe pour construire des formes (même si je ne suis pas sûr de ce que ses capacités sont exactement). Serait-il possible de l'intégrer avec Java "formes" et les menus déroulants? (disponible en VB) Sinon, existe-il des solutions de rechange que je puisse voir?
EDIT: je suis nouveau sur le Swing, donc j'ai mis en place un code pour tester la fonctionnalité de JFreeChart avec elle (tout en évitant l'utilisation de la ApplicationFrame classe de JFree puisque je ne suis pas sûr de la façon qui va travailler avec Swing de zones de liste déroulante et boutons). Maintenant, le graphique est mis à jour immédiatement et l'utilisation du PROCESSEUR est élevée. Serait-il possible de tampon de la valeur avec le nouvel ordre de la Milliseconde() et de le mettre à jour, peut-être deux fois par seconde? Aussi, puis-je ajouter d'autres composants pour le reste de la JFrame sans perturber JFreeChart? Comment dois-je procéder? cadre.getContentPane().add(new Button("Clic")) semble écraser le graphique.
package graphtest;
import java.util.Random;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
public class Main {
static TimeSeries ts = new TimeSeries("data", Millisecond.class);
public static void main(String[] args) throws InterruptedException {
gen myGen = new gen();
new Thread(myGen).start();
TimeSeriesCollection dataset = new TimeSeriesCollection(ts);
JFreeChart chart = ChartFactory.createTimeSeriesChart(
"GraphTest",
"Time",
"Value",
dataset,
true,
true,
false
);
final XYPlot plot = chart.getXYPlot();
ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);
axis.setFixedAutoRange(60000.0);
JFrame frame = new JFrame("GraphTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ChartPanel label = new ChartPanel(chart);
frame.getContentPane().add(label);
//Suppose I add combo boxes and buttons here later
frame.pack();
frame.setVisible(true);
}
static class gen implements Runnable {
private Random randGen = new Random();
public void run() {
while(true) {
int num = randGen.nextInt(1000);
System.out.println(num);
ts.addOrUpdate(new Millisecond(), num);
try {
Thread.sleep(20);
} catch (InterruptedException ex) {
System.out.println(ex);
}
}
}
}
}
OriginalL'auteur thodinc | 2009-09-07
Vous devez vous connecter pour publier un commentaire.
Si votre variable est mise à jour très vite, il n'y a aucun point dans la mise à jour d'un tableau à chaque fois.
Avez-vous pensé à la mise en mémoire tampon de la modification de la variable, et de l'actualisation de l'organigramme sur un thread différent, disons, tous les 5s ? Vous devriez trouver que JFreeChart peut gérer une telle vitesse de mise à jour.
Depuis JFreeChart est un bureau normal de la bibliothèque, vous pouvez l'intégrer en standard avec une application Swing très facilement. Ou, vous pouvez l'utiliser pour le graphique via une application web (par le rendu d'un fichier JPEG, PNG, etc. JFreeChart peut générer une image automatiquement les cartes, de sorte que vous pouvez utiliser mouseovers etc.)
Eh bien, c'est de faire beaucoup de choses - la régénération de la graphique à partir de zéro à chaque fois. Donc, je vous recommande un peu moins d'une mise à jour fréquente (bien sûr cela dépend de votre machine et de votre charge de travail supplémentaire...)
OriginalL'auteur Brian Agnew
Selon ce blog:
http://jonathanwatmough.com/2008/02/prototyping-code-in-clojure/
son possible pour mettre en œuvre réelle-ish temps " affichage de l'audio spectres à l'aide de l'KJ DSP de la bibliothèque:
http://sirk.sytes.net/software/libs/kjdss/index.htm
donc, si vous pouvez vous en tirer avec assez simples, graphiques, il pourrait être une alternative à JFreeChart.
OriginalL'auteur tonys
Si les données est mise à jour plus souvent que vous pouvez générer le graphique, alors vous devriez avoir une tâche dans un thread séparé qui régénère le graphique, et commence une autre régénération, quand c'est fait. Il y a peu de point dans l'exécution de ce minerai souvent que cela, mais si elle s'avère être trop de charge cpu, vous pouvez limiter la fréquence avec laquelle il redémarre. Si les mises à jour ne venez pas, vous ne déclenchent pas le re-générer. J'ai fait quelque chose comme ça dans mon Zocalo projet récemment. Il fait tout, mais l'étranglement arrière.
OriginalL'auteur PanCrit
Répondu avant ici. Votre modification de la variable jusqu'à 50 fois par seconde, mais dans la plupart des cas, vous n'aurez pas besoin de mettre à jour chaque fois qu'une modification est apportée. Au lieu de cela, vous pourriez mettre à jour le graphique à intervalles réguliers (toutes les 100ms par exemple).
OriginalL'auteur kgiannakakis
Eh bien, je suis aussi à l'aide de JFreechart pour les hautes mises à jour. JFreeChart mises à jour jusqu'à 10 à 15 image/seconde, mais l'utilisation de 100% d'utilisation du PROCESSEUR. Mais si je veux le mettre à jour à une fréquence beaucoup plus élevée, il ne sera pas mis à jour. Si vous trouvez toute une bibliothèque qui peut être mis à jour à abt 20 fps et peut être utilisé pour développer une application en Java alors s'il vous plaît me suggérer aussi. J'ai vu de nombreux bibliothèque JFreeChart FAQ mais je ne suis pas sûr si quelqu'un pourrait être utiliser pour les mises à jour à environ 20 fps.
OriginalL'auteur
Vous devriez essayer les diagrammes de VisualVM (partie du JDK).
Intro: http://java.dzone.com/news/real-time-charts-java-desktop
OriginalL'auteur Daumantas
Afin d'obtenir votre CPU bien en dessous de 100% et de permettre à votre GUI d'être à l'écoute, vous devez limiter votre mise à jour des cartes de débit. Un maximum de taux de mise à jour d'environ 24 images par seconde a un sens pour un plan en temps réel; plus vite est plus ou moins impossible à distinguer de toute façon. Si vos données sont à venir dans plus vite que ce taux, vous avez juste besoin de tampon à l'arrière-plan et la mise à jour de votre graphique dans le premier plan à votre guise la vitesse de mise à jour. Dans l'exemple suivant, j'utilise XChart avec un
SwingWorker
thread d'arrière-plan. La saisie des données est simulé à un taux de un pour toutes les 5 ms et le graphique à jour à 24 images par seconde. Ce concept devrait travailler avec JFreeCharts ou de tout autre cartographie la bibliothèque avec de légères modifications. Avertissement: je suis le développeur principal de XChart.OriginalL'auteur herrtim
Peut-être vous pouvez utiliser deux fils. L'un pour la mise à jour de votre variable sorcière priorité est égal à 10.
Et un deuxième thread qui peint aussi rapide que possible de la sorcière de priorité égal à 5.
J'ai dû faire la même chose dans un jeu que je suis en train d'écrire.
C'est possible je n'ai pas compris votre question.
OriginalL'auteur Martijn Courteaux