ButtonGadget reagiert nicht sofort auf Mausklick

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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%.
Bild
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

@MVXA & remi_meier:
Eure Vorschläge meinte ich doch auch. :?
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag 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.
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
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 »

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
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
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 »

>> 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
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
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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:
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 »

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
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
Peter aus der Nordheide
Beiträge: 34
Registriert: 18.05.2005 14:59

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