2015-07-29 2 views
0

J'ai besoin de mettre à jour 6 graphiques en temps réel. Je crée donc une file d'attente séparée pour chaque graphique et j'essaie de le mettre à jour avec timer.schedule mais cela ne fonctionne pas vraiment. En particulier, si je commente les appels de chaque timer.chedule et ne laisse que le premier, cela fonctionne bien. Mais même si j'ajoute second timer.chedule (donc seulement 1 et 2 timers) il gèle. Voici le code que j'utilise:Multi-thread sur le thread UI

timer_graph1 = new Timer(); 
timer_graph1.schedule(new Graph1(), 20, 20); 
timer_graph2 = new Timer(); 
timer_graph2.schedule(new Graph2(), 20, 20); 
timer_graph3 = new Timer(); 
timer_graph3.schedule(new Graph3(), 20, 20); 
timer_graph4 = new Timer(); 
timer_graph4.schedule(new Graph4(), 20, 20); 
timer_graph5 = new Timer(); 
timer_graph5.schedule(new Graph5(), 20, 20); 
timer_graph6 = new Timer(); 
timer_graph6.schedule(new Graph6(), 20, 20); 

class Graph1 extends TimerTask { 

    public void run() { 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       //add data to the graph and update 
       mChart1.invalidate(); 
      } 
     }); 

    } 
} 

//same structure as for Graph1 
class Graph2 extends TimerTask { 

} 

Pourriez-vous nous suggérer quel est le problème avec cette approche?

+0

Bienvenue dans Stack Overflow, mais pouvez-vous expliquer * ne fonctionne pas vraiment * signifie? – Raptor

+0

En particulier, si je commente les appels de chaque timer.chedule et ne laisse que le premier, cela fonctionne bien. Mais même si j'ajoute second timer.schedule (donc 1 et 2 timer seulement) il se fige. –

Répondre

0

De votre code, je peux dire que votre rafraîchissement n'est pas mis à jour pour GUI ou votre GUI clignote rapidement.

La règle de base sur la mise à jour est GUI:

  1. données de mise à jour à backend par thread séparé (s). Utilisez un double tampon si nécessaire.
  2. Appelez toute la mise à jour de l'interface graphique à l'intérieur de SwingUtilities.invokeLater() afin que la mise à jour se fasse dans le thread EDT.
+0

IIRC 'invalidate' est sûr d'appeler sur n'importe quel thread; il indique au thread principal de redessiner ce composant plus tard. – immibis

+0

@immibis C'est. Je n'ai pas touché à l'interface graphique Java depuis un moment alors merci de me rappeler. –

+0

le double tampon fonctionne bien. Merci Alex Suo! –