Delay() Alternative

Anfängerfragen zum Programmieren mit PureBasic.
Jume

Delay() Alternative

Beitrag 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:
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Delay() Alternative

Beitrag 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
a²+b²=mc²
Jume

Re: Delay() Alternative

Beitrag 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.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Delay() Alternative

Beitrag von c4s »

Hört sich so an als könntest du Thread gebrauchen...
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Delay() Alternative

Beitrag 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
a²+b²=mc²
Jume

Re: Delay() Alternative

Beitrag 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.
Jume

Re: Delay() Alternative

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Delay() Alternative

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Jume

Re: Delay() Alternative

Beitrag 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:
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Delay() Alternative

Beitrag 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 ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten