Vlákna v Game of Life – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vlákna v Game of Life – Java – Fórum – Programujte.comVlákna v Game of Life – Java – Fórum – Programujte.com

 

Woodbin
~ Anonymní uživatel
11 příspěvků
12. 10. 2011   #1
-
0
-

Ahoj, nejsem úplně začátečník, ale jsem samouk.
Udělal jsem si jednoduchou Game of Life. Sestává se ze čtyř tříd
Main - hlavní třída, vytvoří instance gridu a okna
GridLogic - logika, obsahuje dvourozměrné pole s buňkami, počítá další generace buňěk apod.
GameWindow - okno hry
Cell - třída buňky

Chci udělat plynulé generování generací a vykreslování. V okně mám tlačítko (togglebutton). Potřebuji, aby se generovalo a vykreslovalo, dokud je tlačítko spuštěno (toggleButton.isEnabled()).

Vlákno jsem implementoval do třídy GameWindow
Rozeběhne se to, nevím ovšem, jak vlákno zastavit, pokud už tlačítko sepnuté není.


Projekt(děláno v Eclipse) je zde http://woodbins.ic.cz/asdf/MyGameOfLife.rar je v tom i javadoc s většinou potřebných informací, je tam i nějakej ten pokus o zastavování, leč bezúspěšný. Snažil jsem se dodržet konvence pro psaní, s výjimkou GameWindow, kde jsem se nehrabal ve vygenerovaném kódu z windowbuilderu

Předem děkuju za pomoc :)

Nahlásit jako SPAM
IP: 89.102.42.–
Woodbin
~ Anonymní uživatel
11 příspěvků
12. 10. 2011   #2
-
0
-
Nahlásit jako SPAM
IP: 89.102.42.–
liborb
~ Redaktor
+18
Guru
13. 10. 2011   #3
-
+1
-
Zajímavé

Tvůj celý problém je v tom, že špatně spouštíš vlákno. Místo t.run() má být t.start(). Teď vlastně zavoláš funkci run() přímo z okna a zablokuješ si to okno, takže další ovládání není možné. start() spustí opravdu jiné vlákno, takže hlavní vlákno okna běží dále nezávisle.

A jak na zapínání a vypínání? Pamatuj si stav stlačení tlačítka (nebo checkbox běží/neběží apod.) nebo se odpíchni od stavu vlákna. Můžeš měnit popisky na tlačítku (start/stop) atd. Když tak se zase zeptej.

Nahlásit jako SPAM
IP: 78.80.52.–
Woodbin0
Duch
13. 10. 2011   #4
-
0
-

Moc děkuju za radu, funguje to :) Ještě musím nějak vyřešit to znovuspouštění. Napadlo mě zastavit vlákno a poté jej znovu spustit, ale metody stop() apod jsou vyřazené. Co zatím zkouším mi ovšem nejde. Kdyžtak ještě napíšu o radu .

Nahlásit jako SPAM
IP: 89.102.42.–
Woodbin0
Duch
14. 10. 2011   #5
-
0
-

Tak jsem zase tady pro radu. Nedaří se mi znovuspustit kód ve vláknu. Spustit a zastavit ho jde, ale když ho chci pustit znovu, nic to nedělá (ale jinak program funguje dál, jde iterovat, přepínat buňky...). Můj pokus vypadá takhle: OBSAH VLÁKNA:  

int i = 0;
  while(true){
    if(shut==false){
     if(i==0){
      grid.update();
      vykresliBunky(jPanel.getGraphics(),grid);
      i=1;
     }
     else{
      i=0;
     }    
    }
     
  }

MOUSELISTENER V TOGGLEBUTTONU  

 public void mousePressed(MouseEvent e) {   if(t.isAlive()==true&&shut==true){
      start();
     }
     if(t.isAlive()==true&&shut==false){
      shut();
     }
     if(t.isAlive()==false){
      try {
       t.start();
      }
      catch (IllegalThreadStateException ex) {
      // TODO Auto-generated catch block
      ex.printStackTrace();
     }

Metody shut() a start() jen mění hodnotu boolean shut Nenapadá někoho co by tam mohlo být špatně? Jestli to zas není nějaká drobnost :) Jinak na linku výš je aktuální verze projektu kdyby jste se chtěli podívat.

Nahlásit jako SPAM
IP: 89.102.42.–
zlz
~ Anonymní uživatel
634 příspěvků
15. 10. 2011   #6
-
+1
-
Zajímavé
Nahlásit jako SPAM
IP: 213.211.51.–
Woodbin0
Duch
16. 10. 2011   #7
-
0
-

#6 zlz
Tak jsem to vyřešil, díky za radu :) Vytvářím nové vlákno při každém kliknutí, pokud už předchozí vlákno umřelo.

 Kód tlačítka:

public void mousePressed(MouseEvent e) {
					if(t.isAlive()==true&&shut==false){
						shut();						
					}if(t.isAlive()==false){
						try {
							start();
							newThread();
							t.start();
						} 
						catch (IllegalThreadStateException ex) {
						// TODO Auto-generated catch block
						ex.printStackTrace();
					}					
				}

 Kód vlákna:

	public void run() {
		int i = 0;
		while(shut==false){
			if(i==0){
				grid.update();
				vykresliBunky(jPanel.getGraphics(),grid);
				i=1;
			}
			else{
				i=0;
			}						
		}	
	}

Pomocné metody shut(); start(); newThread():

public void shut(){
		shut = true;
	}
	
public void start(){		
		shut = false;		
	}

public void newThread(){
		t = new Thread(this);
	}

Moc děkuji všem za pomoc! :)

Nahlásit jako SPAM
IP: 89.102.42.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 39 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý