Delay()

Anfängerfragen zum Programmieren mit PureBasic.
<MeuchleR.>
Beiträge: 5
Registriert: 05.11.2005 12:20

Delay()

Beitrag von <MeuchleR.> »

Hallo,

in PB gibt es ja den Befehl Delay() der das gesamte Programm für eine bestimmte Zeit lang komplett anhält. Existiert auch ein Befehl der es mir erlaubt nur einen bestimmten Teil des Programmes anzuhalten ( wie z.B. eine bestimmte Prozedur ) und nicht alles auf ein mal?

Danke für eure Hilfe :).

<M.>
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Du kannst unter umständen aus der Procedure einen Thread erstellen und dort ein Delay einfügen :freak:
Aber sag lieber mal genau, was Du bezweckst.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

hi, gerade nach sowas such ich auch....

Code: Alles auswählen

 StartDrawing(ScreenOutput()) 
      Locate(0,0) 
      DrawText("TEST")
      Delay(20000)
      Locate(0,15) 
      DrawText("Funzt nich so ganz") 
      StopDrawing() 
Also man sollte erst den ersten Text sehen und nach ner Zeit den anderen.... geht das nur mit Threads?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> geht das nur mit Threads?
wie anders sollte es sonst gehen??? Oder den zu pausierenden Teil einfach
nicht aufrufen im Code
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

>>Also man sollte erst den ersten Text sehen und nach ner Zeit den anderen

Code: Alles auswählen

StartDrawing(ScreenOutput())
  Locate(0,0)
  DrawText("TEST")
StopDrawing()
Delay(2000)
ClearScreen(0)
StartDrawing(ScreenOutput())
  Locate(0,15)
  DrawText("Funzt nich so ganz")
StopDrawing() 
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

OMFG

mach doch sowas nich.

denk immer in kontinuierlichen hauptschleifen.

ein paar frames lang einblenden, stehen lassen, ein paar frames lang ausblenden, dann dasselbe mit dem zweiten text.
sonst macht ein anfänger das nämlich erst so mit fortlaufenden code, und dann kommt:
"so fertig, klappt prima, und jetzt will ich scrollende sterne im hintergrund haben"
also, immer gleich in frames denken, das erspart ne menge umstrickerei nachher.

@topic

proceduren laufen nicht parallel ab, sondern für sich.

das komplette programm läuft normalerweise step-by-step ab, nix davon läuft parallel, denn das ist kein OOP. (und auch da läuft nich wirklich was parallel, nur scheinbar)

schildere doch mal genau, worauf du hinaus willst, dann kann man bestimmt auch ne lösung finden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
mardanny71
Beiträge: 266
Registriert: 05.03.2005 01:15
Wohnort: Thüringen

Beitrag von mardanny71 »

Lies Dir mal das mit ElapsedMiliseonds() durch.
Natürlich dann nicht mit Delay() - sondern Wert in Datumsformat - +x - Vergleichen (größer als) - Aktion.

grüsse an alle
mardanny71
Gruß, mardanny71
Windows 7 - openSUSE 12.1 - KDE 4.7 - PB4.6 beta 4
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

Code: Alles auswählen

Structure timerS
  ID$
  start.l
  duration.l
  mode.l
EndStructure
NewList timer.timerS()

AddElement( timer() )
timer()\ID$="first"
timer()\start=ElapsedMilliseconds()
timer()\duration=1000
timer()\mode=1
AddElement( timer() )
timer()\ID$="second"
timer()\start=ElapsedMilliseconds()
timer()\duration=666
timer()\mode=1


InitSprite()
win=OpenWindow(#PB_Any, 50,50,300,80, "")
OpenWindowedScreen( WindowID(win), 0,0,300,80, 0,0,0)

Repeat

  ForEach timer()
    With timer()
      If ElapsedMilliseconds() > (\start + \duration)
        \mode!1
        \start=ElapsedMilliseconds()
      EndIf
    EndWith
  Next

  ClearScreen(0)
  StartDrawing(ScreenOutput())
    ForEach timer()
      If timer()\mode
        If timer()\ID$="first"
          ;Locate(0,0)
          DrawText(30,35,"first timer on")
        EndIf
        If timer()\ID$="second"
          ;Locate(0,15)
          DrawText(150,35,"second timer on")
        EndIf
      EndIf
    Next
  StopDrawing()


  event=WindowEvent()
  Select event
    Case #PB_Event_CloseWindow
      quit=1
  EndSelect
  FlipBuffers()
  Delay(0)
Until quit
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

So würde erst "TEST" angezeigt und dann "Funzt nich so ganz"

Code: Alles auswählen

Repeat
 Delay(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
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
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

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!
Antworten