Seite 2 von 2

Verfasst: 30.06.2006 21:56
von STARGÅTE
sry hatte was vergessen ^^, natürlich mus Time laufen ^^

Code: Alles auswählen

Repeat 
 Delay(1) 
 Time = Time + 1
  StartDrawing(ScreenOutput()) 
    If Time < 20000 : 
     Locate(0,0) 
     DrawText("TEST") 
    EndIf 
    If Time >= 20000 : 
     Locate(0,15) 
     DrawText("Funzt nich so ganz") 
    EndIf 
  StopDrawing() 
ForEver

Verfasst: 30.06.2006 22:51
von mardanny71
@<MeuchleR.>

Dachtest Du an sowas?

Code: Alles auswählen

aktion.l
zeit.l =0
warte.l = 20000
ende.b = 0

Procedure.b machwas()
Debug "machwas"
Shared ende
ende = 1
EndProcedure

Procedure machwasanderes()
Debug "machwasanderes"
EndProcedure

Repeat

  If zeit = 0
     zeit = ElapsedMilliseconds()
  EndIf

  aktion = zeit + warte 

  If aktion > ElapsedMilliseconds()
    machwasanderes()
  Else
    machwas()
  EndIf
  Delay(1000);nur erstmal zum testen
Until ende = 1
Oder prüfe mal, ob es nicht ein anderes Indiz als Zeit gibt.

grüsse an alle
mardanny71[/code]

Verfasst: 01.07.2006 09:06
von onny
nice, vielen dank für die posts!

Verfasst: 01.07.2006 09:31
von Kaeru Gaman
onny hat geschrieben:hm... versteh ich nich so ganz 0.o
glaub ich werd mich lieber mal mit threads beschäftigen... hoffe da gibts ein paar gute beispiele ^^
thx für die lösungen!
threads sind viel komplexer, beiss dich erstmal durch die timer durch ;)

ein simpler timer:

Code: Alles auswählen

TimeStep.l = 50
Timer.l = Elapsedmilliseconds() + TimeStep
Zaehler.l = 0

Repeat

   If Timer <= Elapsedmilliseconds()
      Timer + TimeStep
      Zaehler +1
   EndIf

   Delay(0)  ; <- CPU-Schoner
Until Abbruchbedingung = #True
hier wird Zähler alle 50ms hochgezählt. das Delay(0) ist nur dazu da, um die CPU nicht auszulasten, es ist für den timer an sich nicht notwendig.
auch wenn das einzelne zählereignis mal ein paar millisekunden falsch liegen kann, dadurch, dass der timer um einen festen wert erhöht wird und nicht auf die aktuellen millisekunden gesetzt, wird im großen und ganzen eine relative geauigkeit erreicht. wenn z.b. das programm längere zeit in einer proc festhängt, holt die schleife alle versäumten steps nach.

Diesen Zähler kann man jetzt unter anderem für eine art ereignistabelle nutzen:

Code: Alles auswählen

LetztEreignis.l = 4

Dim EreignisTime.l(LetztEreignis)
Dim EreignisText.s(LetztEreignis)

EreignisTime(0) =  50 : EreignisText(0) = "Los geht's"
EreignisTime(1) = 100 : EreignisText(1) = "Dann rödel ich mal"
EreignisTime(2) = 250 : EreignisText(2) = "Ha, die Mitte"
EreignisTime(3) = 500 : EreignisText(3) = "Fast fertig"
EreignisTime(4) = 550 : EreignisText(4) = "Das war's"

Ereignisnummer.l = 0
Zaehler.l = 0

TimeStep.l = 50
Timer.l = Elapsedmilliseconds() + TimeStep

Repeat

   ; der Timer wie gehabt
   If Timer <= Elapsedmilliseconds()
      Timer + TimeStep
      Zaehler +1
   EndIf

   ;die Ereignissteuerung
   If Zaehler = EreignisTime(Ereignisnummer)
      Debug EreignisText(Ereignisnummer)
      Ereignisnummer +1
      If Ereignisnummer > LetztEreignis
         Abbruchbedingung = #True
      EndIf
   EndIf

   Delay(0)  ; <- CPU-Schoner
Until Abbruchbedingung = #True
voila :D
btw: diese "Ereignisse" sind selbstgemachte, und nicht zu verwechseln mit Window-Events.

Verfasst: 01.07.2006 09:48
von #NULL
remi meier hat auf seiner page auch ein paar kleine pb-tutorials zur zeitsteuerung
http://mypage.bluewin.ch/remimeier/

Verfasst: 01.07.2006 10:42
von onny
wow, ihr seid echt klasse, vielen dank!