• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Timerprobleme bei iPhone. Brauche schnellstens Hilfe

Krolock

Geocacher
Charlenni schrieb:
Klar. Man muss einfach den Timer im OnTick ereignis wieder stoppen.

Code:
function ztimerTimer1:OnTick()
  ztimerTimer1:Stop()
  -- Was man sonst noch machen möchte
end

Das funktioniert so einfach leider nicht. Man kann Intervaltimer nicht stoppen während sie gerade im ausführenden Modus sind. Das hat mit Synchronitäts-Sicherheits-Mechanismus zu tun. Ein Timer:Stop() wird ignoriert solange sich das Programm in der OnTick() Routine befindet.
Man muss es irgendwie schaffen, dass der Befehl Stop() erst dann gesendet wird, wenn der OnClick() Bereich verlassen ist. Dies man recht einfach über eine MessageBox erreichen, indem man den Spieler auf OK klicken lässt und im OnClicked-Event den Stop() Befehl sendet.
Bis der (im Vergleich zum Rechner) träge Spieler seine Wurstfinger aufs Display bewegt hat, ist OnTick() längst abgearbeitet.
Wem das zuviel Theorie ist, kann sich das ganze auch mit Screenshots aufgehübscht auf WherIBlog (Timer II - Countdown) ansehen.
 

Charlenni

Geomaster
Ok. Gebe mich geschlagen. So einfach ist es dann doch nicht :( .

Um es hin zu bekommen muss man noch etwas über Intervall-Timer wissen. Bei diesen wird der Timer nach der abgelaufenen Zeit der Timer einfach neu gestartet. Dabei wird (zumindest im Emulator) jedesmal das Ereignis OnStart des Timers aufgerufen. Um den Intervall-Timer nun zu stoppen, muss die Stop Methode in das OnStart Ereignis. Ist doch klar, oder? :D

Das Ganze sieht dann so aus:

Code:
function ztimerTimer1:OnTick()
  -- Hier komm alles hin, das bei jedem Tick passieren soll
end

und

Code:
function ztimerTimer1.OnStart()
  -- Hier wird nun auf abbruch geprüft, um zu entscheiden, ob der Intervall-Timer nochmal laufen soll
  if Zaehler > 2 then
    ztimerTimer1:Stop()
  end
end

Und schon klappt es. Auch ohne MessageBox.

Bei Jonny65 seiner Aufgabe nehme ich nun an, dass er im OnStart Event die Variable Zaehler auf 0 setzt. Damit zeigt der Zaehler immer 1 an, da er ja bei jedem Durchlauf auf 0 gesetzt wird und so einfach nicht richtig "in Fahrt kommt".
 

jonny65

Geomaster
Naja, das üben wir aber nochmal bis zur nächsten Klassenarbeit, so richtig und auf den Punkt war das alles nicht :D Was passiert bei der Aufgabe ? Genau, der Timer stoppt NICHT :???: . Wenns so einfach wäre hätt ichs ja nicht gepostet und drum auch die Hinterfrage ein Beitrag zuvor, wer ne geschicktere Lösung hat, bitte posten. Die Itembeschreibung zählt also alle 5 Sekunden hoch 1...2...3...4.... bis irgendwann in paar Monaten mal der Strom ausfällt.
Der Stop geht innerhalb (!) des Timerzyklus imho nur so wie im Beispiel mit der Zeitmessung, also ins OnStart Event legen mit einer Hilfsvariablen. Soll der Timer z.b nach 3 Loops stoppen, erhöht man die Hilfsvariable im Elapse um 1 und frägt dann im OnStart auf 3 ab.
Anders und billig siehts natürlich mit dem stoppen aus, wenn es von "außen" passiert, der Timer sich also nicht selbst stoppen soll, sondern z.b durch ein Zonen Event. OnExit Timerstop.
Oder einen 2. Timer der den 1. stoppt :/

So gehts (vermutlich nur) :
Urwigo (oder ich hab ne alte Version ?) hat bekannterweise einen Fehler in der Hintblase...it does occur und nicht NOT

intervalltimerstoppensogehts.jpg
 

Charlenni

Geomaster
Das habe ich nicht ganz verstanden.

Warum brauchst Du eine Hilfsvariable um den Timer zu stoppen? Wenn Du einen Zaehler hast, der immer schön hochgezählt wird und der Timer soll stoppen, wenn der Zaehler bei 3 ist, dann mach doch einfach eine entsprechende Abfrage in das OnStart Event des Timers.

Im Prinzip läuft das Ganze doch auf den Unterschied zwischen while und repeat raus: soll die Aktion schon beim ersten mal ausgeführt werden, dann packst Du die ganze Logik in das OnStart Event. Wenn die Aktion erst nach dem Ablaufen des ersten Intervalls ausgeführt werden soll, dann packst Du die Logik in das OnTick Event. Abgebrochen wird der Timer immer im OnStart Event. Oder eben von außen. Fertig.
 

jonny65

Geomaster
Die Hilfsvariable ist in dem Fall "Loop", hat mit der var Zähler nix tun. Die sollte halt nur irgendeine Aktion machen während der Timer läuft, hätte genauso eine Telefonklingel sein können (wobei wir schon wieder beim iPhone wären :D ). In dem Fall hätte man natürlich die Variable doppelt benutzen können.

Bei alledem ist mir der Intervalltimer dennoch unsympathisch, weil eben nicht 100% kontrollierbar und er ziemlich schwer nachzuvollziehende nicht gewünschte Abläufe reißen kann. Deswegen verwende ich selber fast ausschließlich Countdowns.
 
Oben