Delay(0) war bevor die Null erfunden wurde (Babylon ca. 305–63 v.Chr.)
PB hat das damals immer automatisch in eine 1 umgesetzt.
Seitdem muss man natürlich delay(1) ensetzen.
pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Die 0 begründet sich also auf der Tatsache, das unter Windows für Delay() die Win-API Sleep genutzt wird und das hat
nicht viel mit Babylon zu tun
PS: Dieser Thread gehört nach Windows, nicht nach Allgemein, Delay() basiert nur unter Windows auf der Sleep-API,
unter anderen OS hat die 0 keine besondere Bedeutung!
Gruß
Thomas
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.
Windows XP: A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution. This behavior changed starting with Windows Server 2003.
A value of INFINITE indicates that the suspension should not time out.
Das Betriebssystem schaltet doch auch automatisch zwischen den laufenden Threads um.
Was ist dann ein sinnvoller Einsatz von Delay(0)?
Wann ist es sinnvoll bewusst Rechenzeit an (irgendeinen anderen) Thread abzugeben?
Danke schon mal,
Guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Das ist sicherlich praktisch, wenn du mit mehreren Threads arbeitest und keine Mutexe oder Semaphoren benutzen willst um auf einen anderen Thread zu warten. Aber sinnvoll ist es natürlich nicht. Es gibt keinen Grund diese Funktionalität irgendwo zu nutzen. Java bietet das auch an: Java - Thread - yield(). Wir sollten das mal in einem Projekt nutzen um ein Busy-Wait zu implementieren. Aber das sollte eigentlich allen Studenten nur zeigen, dass es blöd ist.
Es gibt einen sogenannten Prozessorzeitplan, der deinen Programm Prozessorzeit zuweist. Das wird deswegen mit einem Zeitplan gemacht, um so ineinander verschränkt mehrere Prozesse auf einem physikalischen Prozessor (Kern) nach und nach abarbeiten zu lassen. Aber ich denke das dürfte nichts neues sein. Mit Delay gibt man dem Zeitplan die Möglichkeit, die Zeit auf die dein Programm verzichtet an einen anderen Thread zu übergeben. Setzt du kein Delay ein nimmt dein Programm zum Beispiel während einer Schleife den gesamten Zeitplan für einen physikalischen Prozessor in Anspruch und die KKern-Auslastung schießt nach oben. Ich nutze gar kein Delay(0) sondern immer Delay(1). Man sollte aber bedenken, das dein Programm pro Schleifendurchlauf auch diese Millisekunde länger brauch. Wenn du das nicht willst lagere am besten solche Schleifen in einen Thread aus und lass das Delay weg. Das OS mapped den Thread auf einen anderen Kern und den kannste ja bis zur Vergasung rechnen lassen. Aber ich würde mich auf Delay(0) nicht verlassen. An deinem Screenshot lese ich zumindest heraus, das es dir gar nichts bringt.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB) Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Delay(0) erhöht sogar leicht die CPU-Auslastung. Siehe:
Helpys Testcode wurde bei 60s gestartet und bei 180s nochmal. Man beachte den Wechsel zwischen User- und OS-Mode!
Delay(1) geht im Rauschen der anderen Instruktionen unter.
Gruß
Helle