Alarm dle východu slunce – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Alarm dle východu slunce – Java – Fórum – Programujte.comAlarm dle východu slunce – Java – Fórum – Programujte.com

 

Kuba Salek
~ Anonymní uživatel
1 příspěvek
3. 3. 2016   #1
-
0
-

Dobrý den,

mám dotaz na dořešení kódu pro alarm, který se spouští dle času, kdy vychází slunce. Algoritmus jsme napsali s kamarádem, ale nedořešili zcela do konce. Nadeklarovali jsme pole a do argumentů jsme předali jednotlivé zvonící časy. 

Vím, že nyní jen postavím jednotlivé prvky pole(Leden s indexem 0) proti něčemu, leč nevím proti čemu a do jaké metody, aby byl alarm funkční. 

Zde je dosavadní kód:

package sunrisealarm;

/**
 *
 * @author Fesor
 */
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.swing.JOptionPane;

public class SunriseAlarm {
    List<SunriseTime> times;
    Date alarmed;

    /**
     */
    public void checkAlarm() {
        times = new ArrayList();
        times.add(new SunriseTime(5, 30)); // index 0 je leden vola konstruktor tridy SunriseTime a nastavi parametry
        times.add(new SunriseTime(5, 35)); //unor
        times.add(new SunriseTime(5, 37)); //brezen
        times.add(new SunriseTime(5, 38));// duben
        times.add(new SunriseTime(5, 40));//kveten
        times.add(new SunriseTime(5, 42));//cerven
        times.add(new SunriseTime(5, 45));//cervence
        times.add(new SunriseTime(5, 52));//srpen
        times.add(new SunriseTime(5, 55));//zari
        times.add(new SunriseTime(5, 57));//rijen
        times.add(new SunriseTime(5, 59));//listopad
        times.add(new SunriseTime(6, 01));//prosinec
        alarmed = null;
        Thread t = new Thread();
        t.setPriority(Thread.MIN_PRIORITY);
        t.start(); 
    }
    
    public void run() {
        while(true) { //nekonecny cyklus kontrolujici 1 000 000/sec
            Calendar c = new GregorianCalendar(); 
            int hours = c.get(Calendar.HOUR);
            int minutes = c.get(Calendar.MINUTE);
            int month = c.get(Calendar.MONTH);
            if(times.get(month).getHour() == hours && times.get(month).getMinute() == minutes && (alarmed == null || alarmed.before(new Date()))) { //proc tu mame Date??
                Calendar cal = Calendar.getInstance();// proc sme volali instanci??
                cal.set(Calendar.HOUR, 23);
                cal.set(Calendar.MINUTE, 59);
                cal.set(Calendar.SECOND, 59);
                alarmed = cal.getTime(); //nastavi zpet na aktualni cas
                JOptionPane.showMessageDialog(null, "Alarm zvnoni ;)");
                break;
            }
        }
    }
    public static void main(String[] args) {
        SunriseAlarm sa = new SunriseAlarm();
        sa.checkAlarm();
    }
    
    private class SunriseTime {
        int hour;
        int minute;

        public SunriseTime(int hour, int minute) {
            this.hour = hour;
            this.minute = minute;
        }

        public int getHour() {
            return hour;
        }

        public void setHour(int hour) {
            this.hour = hour;
        }

        public int getMinute() {
            return minute;
        }

        public void setMinute(int minute) {
            this.minute = minute;
        }
    }

Nahlásit jako SPAM
IP: 178.255.168.–
Matrix17
~ Anonymní uživatel
300 příspěvků
6. 3. 2016   #2
-
0
-

Tak předně to vlákno rozhodně musí mít Thread.sleep(cas_v_milisekundach). Je to z toho duvodu aby si procesor "odpočinul" a mohl dělat taky něco jinýho... Tj. do toho nekonečnýho cyklu přidej sleep.

Další věc, to že to kontroluje cca 1 000 000 / sec tbych netvrdil. Může to tak být na tvém počítači ale obecně to rozhodně není pravda. Navíc je to naprosto zbytečné. Máš tam rozlišení na minuty a hodiny, takže i kontrola jednou za sekundu je zbytečná. Stačí ti to jednou za půl minuty nebo i jednou za minutu. Já bych dal spíš jednou za půl minuty.

Teď k dotazu. Předpokládám, že to je program co běží na klasickým počítači. Takže vše co potřebuješ je, vytáhnout si aktuální systémový čas. Zjistit jakej je měsíc a pak porovnat aktuální čas s tím uloženým. Když zjistíš, že je např. 5:23 a slunce má ten měsíc vycházet řekněme v 5:25. Tak se nic neděje... Jelikož se tohle kontroluje jednou za půl minuty tak by se ti nemělo stát, že to "prošvihneš" a pokud ano tak max o sekundy takže stejně o nic nejde (slunce není sprinter to nikam nezdrhne). Takže když se aktuální čas rovná nebo už je za hranicí, tak alarm začne zvonit.

Nahlásit jako SPAM
IP: 213.226.237.–
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, 21 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ý