Seite 1 von 2

Delay() Alternative

Verfasst: 30.09.2011 21:43
von Jume
Tagchen,

ich bins wieder :bounce:


sagt mal gibt es eine Alternative zu Delay() ? Ich wüsste gerne wie ich es hinbekomme das nicht das gesamte Programm anhält.

:coderselixir:

Re: Delay() Alternative

Verfasst: 30.09.2011 22:01
von Kiffi
Jume hat geschrieben:sagt mal gibt es eine Alternative zu Delay() ? Ich wüsste gerne wie ich es hinbekomme das nicht das gesamte Programm anhält.
wenn Du uns sagst, was Du vorhast, könnten wir Dir
vielleicht auch hilfreiche Tipps geben.

Grüße ... Kiffi

Re: Delay() Alternative

Verfasst: 30.09.2011 22:09
von Jume
Stell dir vor du machst programmierst ein Spiel und dort wird wie in einem Browsergame etwas gebaut und dann kannst du ja trotzdem noch andere Dinge machen während dieses Gebäude gebaut wird.

So z.B.

ooooder ich mache einen Wecker und möchte aber auch auf Stop drücken können falls er mich nicht mehr wecken soll.

Re: Delay() Alternative

Verfasst: 30.09.2011 22:09
von c4s
Hört sich so an als könntest du Thread gebrauchen...

Re: Delay() Alternative

Verfasst: 30.09.2011 22:20
von Kiffi
Wenn Du einen Wecker stoppen willst, dann brauchst Du ja
nicht das ganze Programm anhalten (zumal das Anschalten
dann auch nicht mehr funktionieren würde).

Sowas macht man normalerweise mit Setzen und
Abfragen von Variablen

Code: Alles auswählen

Repeat ...

If StopTasteGedrückt
  NichtMehrKlingeln = True
ElseIf StartTasteGedrückt
  NichtMehrKlingeln = False
EndIf

If WeckZeitErreicht
  If Not NichtMehrKlingeln
    Klingeln
  EndIf
EndIf

Until ...
Grüße ... Kiffi

Re: Delay() Alternative

Verfasst: 30.09.2011 22:22
von Jume
hab ich auch schon versucht aber wie genau mach ich das mit thread... muss ich darin dann wieder delay() benutzen ? arg.. ich kann leider mit der beschreibung in der hilfe auch nicht so ganz viel anfangen und finde auch keine aussagekräftigen tutorials dazu.

Re: Delay() Alternative

Verfasst: 30.09.2011 22:30
von Jume
Kiffi hat geschrieben:Wenn Du einen Wecker stoppen willst, dann brauchst Du ja
nicht das ganze Programm anhalten (zumal das Anschalten
dann auch nicht mehr funktionieren würde).

Sowas macht man normalerweise mit Setzen und
Abfragen von Variablen

Code: Alles auswählen

Repeat ...

If StopTasteGedrückt
  NichtMehrKlingeln = True
ElseIf StartTasteGedrückt
  NichtMehrKlingeln = False
EndIf

If WeckZeitErreicht
  If Not NichtMehrKlingeln
    Klingeln
  EndIf
EndIf

Until ...
Grüße ... Kiffi

ok da hast du soweit recht, das war vielleicht ein doofes bsp. von mir.

Code: Alles auswählen

If OpenWindow(0, 524, 239, 171, 166, "Wecker", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    StringGadget(1, 40, 50, 90, 20, "")
    ButtonGadget(2, 40, 75, 90, 15, "Ok")
    TextGadget(3, 40, 30, 90, 15, "Uhrzeit:")
      EndIf
    

  
  Pattern$ = "Musik (*.mp3)"
             Pattern = 0

  
  

 Repeat
    EventID = WaitWindowEvent()
      If EventID = #PB_Event_CloseWindow 
        Quit = 1
      EndIf
      
      
         If EventID = #PB_Event_Gadget
        
        
           If EventGadget()=2
             zeit$ = GetGadgetText(1) 
          Repeat
             uhrzeit$ = FormatDate("%hh:%ii", Date())
          Until uhrzeit$ = zeit$
             Buffer$=Space(128)
             mciSendString_("OPEN bspmusikstueck TYPE MpegVideo ALIAS MP3",Buffer$,128,0)
             mciSendString_("PLAY MP3",0,0,0)
           EndIf
       
      
    
      
         EndIf
  Until Quit=1

nun ist es so das ich nix drücken kann bis es x uhr ist.

Re: Delay() Alternative

Verfasst: 30.09.2011 22:33
von STARGÅTE
Was du machen willst, ist ja nicht eine Zeitlang warten, sonden auf einen Zeitpunkt warten.

Also entweder:

Code: Alles auswählen

Define Time = ElapsedMilliseconds() + 4000
Repeat
	If ElapsedMilliseconds() >= Time
		Debug "4s um"
		End
	EndIf
ForEver
oder mit Timer:

Code: Alles auswählen

Enumeration
	#Window
	#Timer
EndEnumeration


OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
	AddWindowTimer(#Window, #Timer, 4000)

Repeat
	
	Select WaitWindowEvent()
			
		Case #PB_Event_CloseWindow
			End
			
		Case #PB_Event_Timer
			Select EventTimer()
				Case #Timer
					End
			EndSelect
			
	EndSelect
	
ForEver

Re: Delay() Alternative

Verfasst: 30.09.2011 22:40
von Jume
da muss ich jetzt erstmal ein wenig mit rumprobieren, habe noch nicht ganz den durchblick wie das funktioniert bzw. wie ich dem jetzt sagen kann das er dann um xx.xx uhr etwas tun soll. ich bedanke mich erstmal und stelle weitere fragen sofern ich es nicht gebacken bekomme. :mrgreen:

Re: Delay() Alternative

Verfasst: 01.10.2011 00:59
von Bisonte
Also bei Dir können keine Events abgearbeitet werden...

1. WaitWindowEvent()

Solange sich an deinem Fenster nichts tut, wird dort verharrt.... geht also nicht weiter.
Abhile schafft der TimeOut in ms. Hier z.B. WaitWindowEvent(20), heisst : wenn innerhalb von
20 ms kein Event anliegt mach ich trotzdem weiter...

2. innerhalb deiner "Eventschleife" ist eine Repeat ... Until Schleife die erst verlassen wird, wenn
die Uhrzeit erreicht ist... also wieder keine Abarbeitung der WindowEvents...

Bei Fenstern ist es wichtig, Events aus der Warteschlange zu holen, weil sonst das Fenster "hängt".
Das geschieht am besten mit einer Schleife, die dauernd läuft (bis eine Bestimmte Bedingung eintritt
die du abfragen willst).

In deinem Falle willst du aufhören Events aus der Warteschlange zu holen, wenn die Zeit erreicht ist.
Also überprüfst Du lediglich, ob die Zeit erreicht wurde und springst dann aus der Event-Schleife.

Ich habe mir die Freiheit genommen, anhand deines Beispiels das zu erläutern ;)

Code: Alles auswählen

If OpenWindow(0, 524, 239, 171, 166, "Wecker", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
  StringGadget(1, 40, 50, 90, 20, "")
  ButtonGadget(2, 40, 75, 90, 15, "Ok")
  TextGadget(3, 40, 30, 90, 15, "Uhrzeit:")
EndIf

Pattern$ = "Musik (*.mp3)"
Pattern = 0

Repeat
  EventID = WaitWindowEvent() ; <---- Hier wird solange gewartet bis ein Event eintritt (Klick oder Fenster verschieben usw.)
  
  If EventID = #PB_Event_CloseWindow; <--- Dieser Teil ist richtig ;)
    Quit = 1
  EndIf
  
  
  If EventID = #PB_Event_Gadget ; <-- sieht noch gut aus 
    If EventGadget()=2
      zeit$ = GetGadgetText(1)
      Repeat         ;----------------------------- aber hier .... Hier werden nur drei zeilen abgeklappert
        uhrzeit$ = FormatDate("%hh:%ii", Date());--- aber innerhalb dieser zeilen ist kein "Event abholen" mit drin
      Until uhrzeit$ = zeit$ ;--------------------- deswegen "hängt" es hier, bis die zeit erreicht ist
      
      Buffer$=Space(128) ; und das lagert man am besten ausserhalb der Eventschleife....
      mciSendString_("OPEN bspmusikstueck TYPE MpegVideo ALIAS MP3",Buffer$,128,0)
      mciSendString_("PLAY MP3",0,0,0)
    EndIf

  EndIf
Until Quit=1 
und nun eine kleine demonstration wie es besser sein sollte...

Code: Alles auswählen

If OpenWindow(0, 524, 239, 171, 166, "Wecker", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
  StringGadget(1, 40, 50, 90, 20, "")
  ButtonGadget(2, 40, 75, 90, 15, "Ok")
  TextGadget(3, 40, 30, 90, 15, "Uhrzeit:")
EndIf

Pattern$ = "Musik (*.mp3)"
Pattern = 0

Repeat
  
  EventID = WaitWindowEvent(20) ; <--- hier werden nur 20ms gewartet, wenn dann nix passiert ist gehts weiter
  
  If EventID = #PB_Event_CloseWindow
    Quit = 2                          ;<--- hier eine neue Abbruch bedingung, damit die musik nur 
  EndIf                              ;<----gespielt wird, wenn die zeit auch erreicht wurde und nicht weil das fenster zuging
    
  If EventID = #PB_Event_Gadget
      
    If EventGadget()=2            ;<-- hier wird nur der zeit$ der Inhalt des Stringgadgets übergeben, mehr
      zeit$ = GetGadgetText(1)    ;<-- ist nicht nötig
    EndIf
    
  EndIf
  
  uhrzeit$ = FormatDate("%hh:%ii", Date()); <-- hier klappern wir mal ein wenig mit der Uhr, damit wir was zum prüfen haben...
  
  If uhrzeit$ = zeit$ ; hier prüfen wir nur noch ob die zeit erreicht wurde und machen eine neue
    Quit = 1 ;<.... abbruchbedingung die wir gleich abfragen können....
  EndIf
    
Until Quit>0 ; <--- AHA hier ist ende wenn Quit Grösser als 0 ist, also wenn fenster zu oder zeit erreicht

If Quit = 1 ; hier fragem wir bloss noch nach ob in der schleife die zeit erreicht war
  Buffer$=Space(128)
  mciSendString_("OPEN bspmusikstueck TYPE MpegVideo ALIAS MP3",Buffer$,128,0)
  mciSendString_("PLAY MP3",0,0,0)
EndIf

; ansonsten dann das glorreiche 
End
Hoffe ein wenig die Dunkelheit ausgeleuchtet zu haben ;)

P.S.: Über Sinn oder Unsinn dieser Programmzeilen lässt sich streiten und dient nur zur Veranschaulichung ;)