Seite 3 von 3

Verfasst: 14.07.2005 13:11
von MVXA
Also die Delay Funktion erwartet einen LONG Wert. Nur wenn de bei PB einen WORD Wert übergibst, wird er zu LONG gecastet. PB mcht das automatisch. Unter C müsstest du das dann so schreiben: [c]Sleep((long)8)[/c]. Ich hab ja mal einen anderen Vorschlag für Delay geproggt. Das, wenn man in einer For schleife ist, den Zähler so verwenden kann: [c]If (LngI%100) = 0: Delay(1): EndIf[/c] Wobei dann LngI der Zähler ist. Da kommt es dann nur zu allen 100 Schleifendurchgängen ein Delay. Das nutzt die CPU nicht voll aus aber sie schwebt auf 50%.

Verfasst: 14.07.2005 13:22
von Batze
@MVXA & remi_meier:
Eure Vorschläge meinte ich doch auch. :?

Verfasst: 14.07.2005 14:05
von jear
@Peter
Die Diskussion um Delay(x) ist doch von der Ausgangsproblematik ziemlich entfernt.
Man kann mit Delay(0) tatsächlich dafür sorgen, dass die laufende Task unterbrochen wird, damit das Betriebssystem etwas anderes machen kann.
Andererseits bietet sich doch für Dein Grundproblem ein selbst erzeugtes Timer-Event an, das etwa alle 250 ms nachschaut, ob sich etwas getan hat.
Außerdem schreit das Ganze doch danach, die Berechnungen in einer als Thread gestarteten Routine abzuarbeiten. Solange man dort keine Strings anfasst, ist das doch eine einfache und sichere Sache.

Verfasst: 14.07.2005 14:57
von ts-soft
remi_meier hat geschrieben:Ich erklärs mal mit 1/1000 = 0 für die, dies noch nicht verstanden haben. Wie man sieht, sind 1 und 1000 ganzzahlig. Der Compiler rechnet nun auch ganzzahlig! Also 1/1000 = 0.001 für PB = 0, da er 0.001 abrunden muss. Es bringt auch nichts, wenn man 1.0/1000.0 schreibt, da wird zwar in Floats gerechnet und es kommt auch 0.001 raus, aber die Funktion
Delay(LONG) hat als Parameter einen Long (ganzzahlig) verlangt, deshalb
wird 0.001 wieder in eine ganze Zahl gerundet (Casting).
Ich hoffe das ist verständlich

greetz
Remi
Nein :wink:
win32_hlp hat geschrieben: dwMilliseconds

Specifies the time, in milliseconds, for which to suspend execution. 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. A value of INFINITE causes an infinite delay.
Also den zweiten Satz bitte lesen.

Nachtrag: Wie Fred sich im engl. Forum äußerte, in etwa: Delay ist ein simpler Wrapper auf den API-Befehl Sleep

Verfasst: 14.07.2005 15:40
von ts-soft
>> A value of INFINITE causes an infinite delay.
#INFINITE entsprich -1, also 0 und -1 haben eine besonder Funktion. Hat alles nichts mit Casting, Compiler oder ähnlichen Dingen zu tun und ist eigentlich ganz Simple :D

Verfasst: 14.07.2005 15:52
von remi_meier
Öhm, ich glaube wir reden aneinander vorbei <)
Ich hab nur erklärt, wieso 1/1000 für PB gleich 0 ist und somit
Delay(1/1000)
dem
Delay(0)
entspricht :wink:

Verfasst: 14.07.2005 15:54
von ts-soft
remi_meier hat geschrieben:Öhm, ich glaube wir reden aneinander vorbei <)
Ich hab nur erklärt, wieso 1/1000 für PB gleich 0 ist und somit
Delay(1/1000)
dem
Delay(0)
entspricht :wink:
So sieht es aus :) , wollte ja nur damit ausdrücken, das Delay(0) eine besondere Funktion erfüllt, also nicht 0 entspricht sondern ein besonderes Flag ist

Verfasst: 14.07.2005 16:36
von Peter aus der Nordheide
Hallo zusammen,

für mich als Erstklässler in PureBasic war die zwischenzeitliche Diskussion über Delay(0) zwar ganz interessant, aber am speziellen Thema vorbei, weil Delay(0) eben nicht immer (zuverlässig) im µsec - Bereich arbeitet.

Batze war da schon in meinem Sinne richtig, nur hatte ich ihn zuerst falsch verstanden.

Der Vorschlag von Thomas, die Abfrage in den FOR - NEXT Schleifen weiter nach außen zu legen, wäre natürlich auch gegangen.

Ich habe mich jetzt für folgende Lösung entschieden :

Code: Alles auswählen

                 
                  Select = WindowEvent()
              
                  Case #PB_EventCloseWindow
                        
                        EventID = #PB_Event_CloseWindow
                        
                        Abbruch = Abbruch + 1
                        
                        FreeGadget(95)
                        
                        Break 12
                                     
                  Case #PB_Event_Gadget
                  
                        EventID=EventGadgetID() 
                        
                        If EventID = 95
                        
                        Abbruch = Abbruch + 1
                        
                        FreeGadget(95)
                        
                        EndIf
                                                                                             
                        Break 12
                        
                  Default 
                                        
                        If M = Y       ;  M = lfd.Reihenzähler    
                        
                        Delay(1)
                                              
                        Y = Y + 10000  ;  Z = Zähler in 10.000er Schritten
                       
                        EndIf
                                          
                  EndSelect
                   
Die vorhergehenden Versuche haben folgendes erbracht :

Bei einem Delay(0) ohne Zeitschleife brauchte er für 30.421.755 Reihen 5 Min.
Erstaunlicherweise war er da zwischen den Reihen 20 Mio und 30 Mio bei einer CPU Auslastung von 100% !

Beim gleichen System ganz ohne Delay und ohne Zeitschleife brauchte er ebenfalls 5 Min bei einer Auslastung von rund 85% !

Nach meiner Einschätzung ist Delay(0) also hier nicht unbedingt zu verwenden.

Dann lieber "nur" alle 10.000 Durchläufe eine Ruhepause für Windoofs, aber die dann zuverlässig mit Delay(1) !?

Bei der jetzigen Lösung braucht er rund 04:30 Min. bei einer Auslastung von rund 60 %.

Ich meine, eine Lösung mit der man leben kann.

@jear
Außerdem schreit das Ganze doch danach, die Berechnungen in einer als Thread gestarteten Routine abzuarbeiten. Solange man dort keine Strings anfasst, ist das doch eine einfache und sichere Sache.
Da gehe ich dann ran, wenn ich die Versetzung in die 2. PB-Klasse geschafft habe. :roll:

Euch Allen aber ein herzliches Dankeschön für die rege Diskussion und die vielen Anregungen.

Gruß Peter