/ / invokeLater wird nicht aufgerufen - swing, user-interface, thread-safety

invokeLater wird nicht aufgerufen - swing, user-interface, thread-safety

Ich arbeite an einer Alarmanwendung. Ich benutze die SwingUtilities.invokeLater-Methode, um meine Benutzeroberfläche für die Snooze-Funktion aufzurufen. Beim Ausführen ist mir jedoch aufgefallen, dass die SwingUtilities.invokeLater-Funktion nicht aufgerufen wird. Bitte helfen Sie mir bei diesem Problem

public class IsTime {
int hrs;
int min;
int sec;
GregorianCalendar clk=new GregorianCalendar();
Calendar gtl= Calendar.getInstance();

mp3 mix=new mp3();



public void makeReady(int h,int m,int s,String ampm){

Calendar c1=Calendar.getInstance();
c1.set(Calendar.HOUR_OF_DAY,h);
c1.set(Calendar.MINUTE, m);
c1.set(Calendar.SECOND,s);


if("PM".equals(ampm)){
c1.set(Calendar.AM_PM, Calendar.PM);
if(Calendar.getInstance().get(Calendar.AM_PM)==Calendar.PM){

if(c1.after(Calendar.getInstance())){
check(c1);
}
c1.set(Calendar.DAY_OF_YEAR,c1.get(Calendar.DAY_OF_YEAR)+1);

check(c1);

}
}
if(Calendar.getInstance().get(Calendar.AM_PM)==Calendar.AM){
if(c1.after(Calendar.getInstance())){
check(c1);
}

c1.set(Calendar.DAY_OF_YEAR,c1.get(Calendar.DAY_OF_YEAR)+1);

check(c1);
}
if(Calendar.getInstance().get(Calendar.AM_PM)==Calendar.PM){
c1.set(Calendar.DAY_OF_YEAR,c1.get(Calendar.DAY_OF_YEAR)+1);
check(c1);
}
}
public void check(Calendar ch){
while(!(Calendar.getInstance().after(ch))){//this line checks if it is time to sound alarm
}

SwingUtilities.invokeLater(new Runnable(){//here is my invokelater method

public void run(){
System.out.println("git to invoke");
new Snooze();

}

});
mix.start();


}
public void makeReady(int mis){
Calendar sz=Calendar.getInstance();
sz.set(Calendar.SECOND, 0);
sz.set(Calendar.MINUTE, Calendar.getInstance().get(Calendar.MINUTE)+mis);
check(sz);
}


}

Antworten:

2 für die Antwort № 1

Diese Zeile ist wirklich nicht der richtige Weg, um eine "Warte" -Operation durchzuführen:

while (!Calendar.getInstance().after(ch)) {// this line checks if it is time to sound alarm
}

sondern tun:

Thread.sleep(ch.getTimeInMillis()-System.currentTimeMillis());

(und Sie sollten sicherstellen, dass es positiv ist). In der jetzigen Situation wird Ihr Code fortlaufend prüfen, ob es Zeit ist, die Ihre CPU wahrscheinlich zum Erliegen bringt.

Für dein invokeLater()Es ist schwer zu sagen, ohne ein funktionierendes Beispiel SSCCE). Versuchen Sie, direkt vor dem Anruf ein Protokoll zu erstellen und zu überprüfen, ob es in Ihrer Konsole angezeigt wird.