ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
1673
1673
EMPFEHLEN
-
Hi,
ich habe meine eigene Runmethode geschrieben.
Sie soll eine Art Timer darstellen und deshalb von 10 auf 0 runterzählen und nach einer Sekunde halt immer repaint() aufrufen.
Fkt soweit auch wunderbar, aber da der Benutzer des Programms den Countdown manuell abbrechen kann, ist eine mir unklare Sache aufgetreten.
Der Thread schläft ja immer eine Sekunde, bevor er wieder alles neu zeichnet! Wenn der Benutzer den Thread jetzt anhält durch eine bestimmt Aktion (also die zeitBoo Variable auf false und ZeitAnzahl auf -1 gesetzt) und innerhalb von 1 Sekunde wieder den Thread startet durch eine andere Aktion, dann setzt er zwar den Timer auf 10, aber er wartet nicht mehr 1 Sekunde bis er auf 9 geht, sondern nur noch die Restmillisekunden die vom alten Thread übriggeblieben waren.
Zur Veranschaulichung hier der Code der RunMethode
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public void run() { while (true) { if (ZeitBoo == true) { try { Zeit.sleep(1000); } catch (InterruptedException e) { //falls ein Fehler auftritt } repaint(); ZeitAnzahl--; if (ZeitAnzahl == -1) { Fertig(); } } } }
Außerdem passiert es manchmal (sehr selten), dass er eine Sekunde nicht darstellt und beispielsweise gleich von 9 auf 7 springt.
Wie kann ich beide Probleme beheben? Vor allem möchte ich, dass wenn ich die Boolean Variable ZeitBoo auf true setze, er dann wirklich neu beginnt und von 10 auf 0 runterzählt und immer 1 Sekunde genau wartet.
-
28.03.05 15:09 #2
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
Wie wäre es denn, wenn du:
Code :1 2 3 4 5
try { Zeit.sleep(1000); } catch (InterruptedException e) { //falls ein Fehler auftritt }
hinter den if-Block:
Code :1 2 3
if (ZeitAnzahl == -1) { Fertig(); }
legen würdest?
Gruß Tom
-
Das Problem ist ja das ich von einer anderen Klasse aus die Boolean Variable auf false setze und auch in der anderen Klasse sie wieder auf true setzen kann.
Das Problem ist bloss wie gesagt, wenn dies innerhalb von 1 Sekunde alles passiert, dann ist das erste Zeitintervall von 10 auf 9 nur ein paar millisekundne und keine ganze Sekunde.
Und ist es zu erklären warum er manchmal direkt von 9 auf 7 geht und scheinbar vergisst bei 8 zu repainten? wie gesagt der 2te fehler tritt nur sehr sehr sporadisch auf!
-
28.03.05 15:41 #4
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
Das ist ein Timing Problem bei der Ablauflogik deines Programmcodes.Und ist es zu erklären warum er manchmal direkt von 9 auf 7 geht und scheinbar vergisst bei 8 zu repainten? wie gesagt der 2te fehler tritt nur sehr sehr sporadisch auf!
Schau mal hier:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
/** * */ package de.tutorials; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; /** * @author Administrator * */ public class Counter extends JFrame { private JButton btn; private JLabel lbl; private boolean pause; private int cnt = 10; private Thread runner = new Thread() { public void run() { while (true) { if (!pause) { lbl.setText("" + cnt); cnt--; if (cnt < 0) { fertig(); break; } try { sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } } else { try { sleep(100L); } catch (InterruptedException e) { e.printStackTrace(); } } } } }; public Counter() { super("Counter"); setDefaultCloseOperation(EXIT_ON_CLOSE); btn = new JButton("action"); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pause = !pause; } }); lbl = new JLabel(" "); add(btn, BorderLayout.WEST); add(lbl, BorderLayout.EAST); pack(); setVisible(true); runner.start(); } private void fertig() { System.out.println("fertig"); } /** * @param args */ public static void main(String[] args) { new Counter(); } }
HTH,
Gruß Tom
-
ah dankeschön
bis jetzt kam der Fehler nicht mehr, als ich es verändert habe (also der zweite Fehler)!
Für den anderen Fehler habe ich es jetzt so gemacht, dass der User erst wieder an anklicken kann, wenn die Zeit abgelaufen ist. So umgehe ich das einfach. Ist zwar nicht im Sinne des Erfinders aber es funktioniert!
EDIT: Ok zu früh gefreut, habe es so geändert wie in deinem Bsp leider passiert es trotzdem manchmal noch, aber egal ich übersehe es am besten.Geändert von dapor (28.03.05 um 17:16 Uhr)
Ähnliche Themen
-
Frage zu generischer Methode
Von DarthShader im Forum JavaAntworten: 7Letzter Beitrag: 29.12.07, 13:19 -
frage zu java: rekursive methode
Von redbuttler im Forum C/C++Antworten: 1Letzter Beitrag: 25.11.07, 23:59 -
Vor Aufruf einer bestimmten Methode immer erst eine andere Methode aufrufen
Von lernen.2007 im Forum JavaAntworten: 2Letzter Beitrag: 06.06.07, 18:37 -
Frage zur Paint-Methode und zu JFrame
Von dapor im Forum JavaAntworten: 8Letzter Beitrag: 01.02.05, 08:48 -
Frage zur Methode - split oder nicht
Von Feely im Forum PHPAntworten: 4Letzter Beitrag: 20.01.05, 09:06





Zitieren

Login





