PB in wikibooks -> ist folgendes korrekt?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

PB in wikibooks -> ist folgendes korrekt?

Beitrag von Pr0fessor »

huhu....

ich habe folgenden beitrag gelesen und kann nicht recht glauben was dort bezüglich des waitwindowevent und timeout geschrieben wurde.
könnt ihr mir da zustimmen oder habe ich wieder irgendwas falsch verstanden?! bzw. welchen vorteil hat der timeout ?
WindowEvent() / WaitWindowEvent()

Es gibt zwei Funktionen, mit welchen ein Ereignis abgefragt werden kann. Diese sind WindowEvent() und WaitWindowEvent(), wobei der einzige Unterschied darin besteht, das WaitWindowEvent() darauf wartet bis etwas geschieht und erst dann einen Wert ausgibt, während WindowEvent() bei jedem Aufruf entweder das Event, oder solange nichts passiert ist, den Wert '0' zurück gibt. WindowEvent() sollte vermieden werden, da das Programm auch wenn es nicht benutzt wird die CPU stark belastet. Die Funktion WaitWindowEvent() unterstütz den optionalen Parameter 'timeout' welcher zulässt das das Programm mit geringer CPU Auslastung Berechnungen durchführen kann.

; Listing 39: WindowEvent

OpenWindow(0,0,0,400,200,"Uhr",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(0,0,100,400,20,"",#PB_Text_Center)
Repeat

Select WaitWindowEvent(20)
Case #PB_Event_CloseWindow
End
EndSelect

SetGadgetText(0,FormatDate("%hh:%ii:%ss",Date()))

ForEver


Der Timeout wurde hier auf 20 Millisekunden gesetzt, das heißt wenn das Programm 20ms gewartet hat gibt es wie WindowEvent() eine 0 zurück. Diese Variante hat gegenüber einer Kombination aus WindowEvent() und Delay(20) den Vorteil, das sollte vor Ablauf der 20ms etwas passieren, z.B. es wird ein Button gedrückt, kann das Programm sofort reagieren und muss nicht erst noch die 20ms abwarten bis es wieder etwas machen kann. FormatDate wird verwendet, um auf einfache Weise ein Datumswert in verständlicher Weise als String darzustellen.
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: PB in wikibooks -> ist folgendes korrekt?

Beitrag von Bisonte »

Das ist schon so richtig ;)

Soll heissen :

WaitWindowEvent(100) würde, solange kein Event anliegen, 100 ms warten und dann eine 0 zurückliefern (also kein Event).

Das hilft dem OS, die Rechenzeit innerhalb dieser 100 ms anderen Tasks zuzuweisen, da du sie ja nicht brauchst...
Deswegen ist die CPU-Last dadurch auch nicht auf 100% wenn das Programm läuft.

So mal versuchterweise simpel erklärt...
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​​
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

Re: PB in wikibooks -> ist folgendes korrekt?

Beitrag von Pr0fessor »

hmmm - bringt das denn was? denn wenn es in einer schleife ist wird doch eh zu Waitwindowevent zurückgekehrt und dort gewartet... außerdem ist doch eh nicht die CPU-last auf 100%.

und sollte man denn einen timeout einfügen wenn es denn das system "entlastet" ?
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: PB in wikibooks -> ist folgendes korrekt?

Beitrag von hjbremer »

Das bringt sehr viel, z.B. wenn du den Status eines Movies abfragen willst

event = WaitWindowEvent(100)

if MovieStatus(0) = 0 ; Movie ist zuende
PlayMovie(0, id)
endif

Dadurch wird das Movie endlos abgespielt, sehr simpel
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

Re: PB in wikibooks -> ist folgendes korrekt?

Beitrag von Pr0fessor »

tut mir leid aber irgendwie versteh ichs glaub ich nicht.... :(

also es ist doch so:
Waitwindowevent(100) wartet bis ein ereignis auftritt. Tritt nach 100ms kein ereignis auf wird 0 zurückgeliefert und es wird aus der wartestellung ausgebrochen. wenn eine schleife vorhanden ist wird wieder zu Waitwindowevent(100) zurückgekehrt und 100ms auf ein ereignis gewartet - usw.
so suggeriert mir das die hilfe. :oops:

und durch den timeout werden doch mehr events erzeugt (0) als sonst.... denn anstatt auf einem event zu warten erden alle 100ms "0" ausgegeben. das versteh ich nicht so recht was das bringen soll - sorry

(und bei normalen anwendungen macht es doch nicht soo viel sinn ein timeout einzubauen oder?)
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PB in wikibooks -> ist folgendes korrekt?

Beitrag von STARGÅTE »

Wenn du mit "normal" meinst, dass du eine richtige Eventschleife aufgebaut hast, ja - dann ist ein TimeOut unnötig.
Und nachdem die WindowTimer eingeführt wurden, ist das Timeout auch überflüssig geworden, da man das Warten auch mit einem Timer (zB 100ms), welcher ja ein Event auslöst unterbrechen kann.

Der Timer hat sogar noch den Vorteil, dann er wirklich alle 100ms ein Event abgibt und nicht die Rechenzeit des anderen Codes hinzukommt.
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
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: PB in wikibooks -> ist folgendes korrekt?

Beitrag von NicTheQuick »

Oder einfach gesagt: Das Timeout macht nur dann Sinn, wenn du unabhängig von Events, aber regelmäßig noch beispielsweise ein Gadget aktualisieren willst.
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

Re: PB in wikibooks -> ist folgendes korrekt?

Beitrag von Pr0fessor »

aha :D

also bei sowas machts sinn?! (besser als delay)

Code: Alles auswählen

;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Text_0
EndEnumeration


Procedure Open_Window_0(text.s)
  If OpenWindow(#Window_0, 220, 0, 289, 38, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar| #PB_Window_BorderLess | #PB_Window_ScreenCentered )
        TextGadget(#Text_0, 10, 10, 270, 20, text.s, #PB_Text_Center)
     EndIf
  EndProcedure

Open_Window_0("Test")
Repeat
wait = WaitWindowEvent(2000)
Until wait = 0
und noch ne frage: warum verschwindet das "Test"-Fenster sofort nach kompilieren mit eingeschaltetem debugger und mit ausgeschaltetem debugger nicht?
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PB in wikibooks -> ist folgendes korrekt?

Beitrag von STARGÅTE »

also bei sowas machts sinn?!
Nein.

An dieser Stelle wäre wie schon angesprochen ein Timer nötig.

Code: Alles auswählen

Enumeration
	#Window
	#Gadget
	#Timer2000
EndEnumeration


OpenWindow(#Window, 0, 0, 400, 100, "Window", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(#Gadget, 10, 10, 380, 20, "Hallo Welt!", #PB_Text_Center)
AddWindowTimer(#Window, #Timer2000, 2000)

Repeat
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			Break
		Case #PB_Event_Timer
			Select EventTimer()
				Case #Timer2000
					Break
			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
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

Re: PB in wikibooks -> ist folgendes korrekt?

Beitrag von Pr0fessor »

ahh - Danke dir :D
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Antworten