Zastavení smyčky – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zastavení smyčky – Java – Fórum – Programujte.comZastavení smyčky – Java – Fórum – Programujte.com

 

Radek
~ Anonymní uživatel
133 příspěvků
29. 11. 2013   #1
-
0
-

Zdravím,

prosím Vás o radu. Vytvářím GUI aplikaci a mám docela problém. Program je taký debilníček na připomínky. Zadáte datum připomínky a text připomínky a kliknete na uložit. Poté se spustí nekonečná smyčka která neustále čte soubor a porovnává zadané datum s aktuálním a to dostane můj program do stavu kdy se zhroutí a musí se zastavit přímo v IDE. Problém je v tom, že bych potřeboval mít možnost ovlivňovat soubor (ukládat do něj nové data) i při běhu smyčky, která ten soubor neustále prochází

Přirovnání k mému problému: Děti si nastoupí do kolotoče, ten se roztočí (na pořád). Další děti na něj nastoupit nemůžou, protože se kolotoč právě točí, můžou na něj nastoupit až se zastaví. Ale já potřebuji aby na něj mohli nastupovat i během jeho točení. 

Děti = datum připomínky a text připomínky (data které potřebuji zapsat do souboru)

Kolotoč = nekonečná smyčka ( neustále prochází soubor a hledá shodu aktuálního data se zadaným ) 

Budu vděčný za jakoukoliv radu, děkuji.

Nahlásit jako SPAM
IP: 213.194.213.–
Flowy0
Věrný člen
29. 11. 2013   #2
-
0
-

no prvotny problem budes mat asi v tom ze ked nechas stale kontrolovat nejaku premennu tak sa procesor bude venovat len tomu (pri zlepseni procesoru sa skrati doba kontroly ale ziskas tym len viac kontrol za sekundu a nie prestavky) ... to ze tam nemozes zapisovat pocas citania je uz vedlajsie

najjednoduchsie bude pouzit nejaky vstavany timer v jave ... pripadne si spravit nejaky jednoduchy sam ... vytvoris si thread (ktory bude bezat vo vlastnom vlakne programu a teda nebude brzdit hlavne vlakno) ... ten si nastavis aby sa obnovoval pravidelne po nejakom case (najjednoduchsie nekonecny loop s prestavkamy typu thread.sleep) ... v hlavnom vlakne si vytvoris nejaku runnable metodu ktoru posles do timeru a nastavis v akom case sa ma spustit

problem s read/write sa da riesit jednoducho redundanciou dat tym ze cas v timeri bude proste prepocitany cas spustenia (nastupu) a vobec nemusi komunikovat so suborom 

Nahlásit jako SPAM
IP: 178.41.208.–
https://github.com/Flowy
sleepy
~ Anonymní uživatel
422 příspěvků
29. 11. 2013   #3
-
0
-

Drz vsetko v pamati, ak planujes pouzit menej, so suborom sa hraj len v tedy, 

class DiaryEventHandler{
	private Set<DiaryEvent> diary = Collections.synchronizedSet(new HashSet<DiaryEvent>());

	private Timer = new Timer();

	public addNewEvent(final DiaryEvent evt) {
		diary.add(evt);
		TimerTask task = new TimerTask(){
			public void run(){
				printMessageOnScrren(evt.getMessage());
				diary.remove(evt);
			}
		}
		timer.shedule(task, evt.getDate());
	}
	
	// Vtimery budes mat problem s rusenim taskov, jedina moznost 
	// je ukoncit timer vytvorit novy a vlozit do neho vsetky od znova, 
	// lebo TimerTask sa neda interruptnut.

	// dalsie metody ...

	
}

ked to naozaj potrebujes (Pri nacitani aplikacie, ukonceni a ulozeni zmien). Dalsia vec ak si jediny kto k suboru pristupuje, nepotrebujes ziadnu kntrolu, lebo sami z nicoho sa data neprehadzu, ak tam sucastne pristupuju viacery, pozi bud eventy, alebo observer model. A namisto cyklu na kontrolu, kedze mas nejake datumy pripomienky, pouzi Timer a vytvor si TimerTask co ma nastat v najblizsej buducnosti a timer bude cakat doi vtedy, kym udalost nastane. Idealne by bolo mat tie Datumi v nejakej prioritnej fronte (Strome, niecom co je usporiadane). Riesenie problemov s pridanim noveho Datumu by si sa len pozrel ci ten datum je nutne vykonat skor ak ten o ktory sa stara tvoj timer, ak je ho nutne vykonat skorej ten v timery. Zrusis ten v timery a vratis do fronty a tento vrazis do timeru ako novy TimerTask. Pri vykonani prikazu v timery sa okamzite popne dalsi najmensi z fronty a hodi do timeru. Vidim to takto:

Nahlásit jako SPAM
IP: 147.175.177.–
Radek
~ Anonymní uživatel
133 příspěvků
29. 11. 2013   #4
-
0
-

Děkuju mockrát za rady...smyčku už jsem vyřešil a aplikace se mi už nekousla. Jinak jak jsem zjistil tak máte pravdu ten timer bude nejvhodnější a ukládat to do paměti....děkuju moc ! :-)

Nahlásit jako SPAM
IP: 213.194.213.–
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, 4 hosté

Podobná vlákna

Zastaveni behu programu — založil Tom@sQo

C# jednoduche zastaveni cyklu — založil Vladimir

Zastaveni vystupu z konzoly — založil Karel

Smyčky — založil

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ý