Avatar billede esbenp Nybegynder
02. november 2005 - 23:41 Der er 9 kommentarer og
1 løsning

Threads: adskillese af GUI og logik

Jeg har lavet et spil, som i øjeblikket kører kun med et tekst interface. Jeg vil gerne koble det sammen med en swing GUI. Spillet kører i set eget loop, så spørgsmålet er hvordan jeg bedst kan opdatere GUI'en med det der sker i spillet, uden at jeg skal til at flytte spil kode til GUI'en.

Eksempel:
public class Spil1 {
    public Spil1(){
        Gui a = new Gui();
        while(true){
            if(a.ventPåMig)
                try {
                    Thread.sleep(30);
                    continue;
                } catch (InterruptedException e) {}
            a.update("Hvad du nu har brug for at vide");
        }
    }
}

class Gui { // En JFrame eller lign.
    public boolean ventPåMig = true;
   
    public void update(Object noget){
        ventPåMig = false;
    }
}


Er det sådan man gør eller findes der en smartere måde?
Avatar billede arne_v Ekspert
02. november 2005 - 23:43 #1
observer pattern måske ?
Avatar billede esbenp Nybegynder
03. november 2005 - 00:02 #2
Observer er kun halvdelen af løsningen. Jeg har også brug for at få min logik til vente på hændelser i grænsefladen. Altså jeg vil gerne af med sleep.

Kan man låse tråden på en måde, eller er sleep ok at bruge?
Avatar billede arne_v Ekspert
03. november 2005 - 00:05 #3
hvis du har mulighed for det så lad GUI event lave et simpelt kald til
noget spil kode

en tråd som venter kan nemt blive problematisk
Avatar billede arne_v Ekspert
03. november 2005 - 00:06 #4
hvis du vil have en seperat spil tråd som venter så lav en queue og lad GUI
smide komamndoer på køen og spil tråden hente fra queuen
Avatar billede esbenp Nybegynder
03. november 2005 - 00:22 #5
Ja ok. Tror jeg har det.

Men jeg vil stadig have brug for et loop der hedder

while(true)
  if(myQueue.isEmpty())
    try{
      Thread.sleep(k);
      continue;
    }
    catch(Exception e){}
Avatar billede arne_v Ekspert
03. november 2005 - 00:30 #6
java 1.5 har en blocking queue

men for ældre java versioner skal du selv blokke

(dog vil bruge af wait/notify nok være bedre end sleep)
Avatar billede esbenp Nybegynder
03. november 2005 - 00:32 #7
Kan du give et eksempel på wait/notify ? Jeg har ikke kunnet fået det til at virke.
Avatar billede arne_v Ekspert
03. november 2005 - 00:34 #8
det kan også godt drille lidt

men det kræver ikke så meget kode:

import java.util.*;

public class Queue {
  private LinkedList q;
  public Queue() {
      q = new LinkedList();
  }
  public synchronized void enqueue(Job j) {
      q.addLast(j);
      notifyAll();
  }
  public synchronized Job dequeue() throws InterruptedException {
      while(q.isEmpty()) {
        wait();
      }
      return (Job)q.removeFirst();
  }
  public synchronized boolean isDone() {
      return q.isEmpty();
  }
}
Avatar billede esbenp Nybegynder
03. november 2005 - 00:50 #9
smart. Smid et svar
Avatar billede arne_v Ekspert
03. november 2005 - 09:51 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester