Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
2 - PROFAN-Programmierung

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Neuerer Beitrag  |  Älteres Thema 
 Messageloop direkt aufrufen: LÖSUNG GEFUNDEN!
Autor: Jens-Arne Reumschüssel (---.dip0.t-ipconnect.de)
Datum:   10.01.19 21:32

Uff, ich habe die Lösung gefunden!

case %peekmessage: getmessage

ruft den Messageloop auf, wenn eine Message anliegt, und das ganz ohne lästige Warterei! Das dürfte sogar noch schneller gehen, als immer direkt den Messageloop aufzurufen, es sei denn, dass auch dieser zu seinem Beginn prüft, ob überhaupt eine Message vorliegt.

Herzlichen Dank noch einmal für's Mitdenken!

Beste Grüße, Jens-Arne



Nachricht bearbeitet (10.01.19 22:34)

Beitrag beantworten
 
 Re: Messageloop direkt aufrufen: LÖSUNG GEFUNDEN!
Autor: p. specht (---.aon.at)
Datum:   12.01.19 18:38

Kleiner Test dazu:
 WindowTitle "Messageabholendes Waitinput beschleunigt:"+\
 "     Lösung von Jens-Arne Reumschüssel testen"
 '(CL) CopyLEFT 2019-01 by P.Specht, Vienna/AT/EU
 
 CLS:Randomize:font 2
 declare n&,tm&,i&,x&,y&,txt$,ungueltig&
 
 $IFNDEF COMPILER
 txt$="INTERPRETER"
 n&=2500
 $ELSE
 txt$="COMPILER"
 n&=4000
 $ENDIF
 
 AppendMenuBar 100," "+txt$+" zählt bis "+str$(n&)+\
 ".     ESC-Taste soll erkannt werden und zerstört den laufenden Test!"
 
 
 print "\n OHNE Beschleunigung:",:x&=%pos:y&=%csrlin
 waitinput 3:sound 200,20:ungueltig&=0
 tm&=&GetTickCount
 Whileloop n&:locate 20,20:print &Loop;"     ";
   i&=&Loop
   waitinput 3
   :if %Key="27":ungueltig&=1:break:endif
 Endwhile
 tm&=&GetTickCount-tm&
 locate y&,x&
 ifnot ungueltig&: print tm&,"ms"
 else :print "<abgebrochen>":clear ungueltig&
 Endif
 
 
 print "\n NUR Fastmode:",:x&=%pos:y&=%csrlin
 waitinput 3:sound 200,20:ungueltig&=0
 tm&=&GetTickCount
 set("Fastmode",1)
 Whileloop n&:locate 20,20:print &Loop;"     ";
   waitinput 3
   :if %Key="27":ungueltig&=1:break:endif
 Endwhile
 set("Fastmode",0)
 tm&=&GetTickCount-tm&
 locate y&,x&
 ifnot ungueltig&: print tm&,"ms"
 else :print "<abgebrochen>":clear ungueltig&
 Endif
 
 
 print "\n NUR MIT rnd()-Chance:",:x&=%pos:y&=%csrlin
 waitinput 3::sound 200,20:ungueltig&=0
 tm&=&GetTickCount
 Whileloop n&:locate 20,20:print &Loop;"     ";
   if rnd()>0.95
     waitinput 3
    :if %Key="27":ungueltig&=1:break:endif
   endif
 Endwhile
 tm&=&GetTickCount-tm&
 locate y&,x&
 ifnot ungueltig&: print tm&,"ms"
 else :print "<abgebrochen>":clear ungueltig&
 Endif
 
 
 print "\n LÖSUNG von Jens-Arne R.: Fastmode mit %PeekMessage:",:x&=%pos:y&=%csrlin
 waitinput 3:sound 200,20:ungueltig&=0
 tm&=&GetTickCount
 set("Fastmode",1)
 Whileloop n&:locate 20,20:print &Loop;"     ";
   if %PeekMessage
     waitinput 3
     :if %Key="27":ungueltig&=1:break:endif
   Endif
 Endwhile
 set("Fastmode",0)
 tm&=&GetTickCount-tm&
 locate y&,x&
 ifnot ungueltig&: print tm&,"ms"
 else :print "<abgebrochen>":clear ungueltig&
 Endif
 
 
 print "\n OHNE JEDE ABFRAGE:",:x&=%pos:y&=%csrlin
 waitinput 3:sound 200,20:ungueltig&=0
 tm&=&GetTickCount
 Whileloop n&:locate 20,20:print &Loop;"     ";
 '
 Endwhile
 tm&=&GetTickCount-tm&
 locate y&,x&
 ifnot ungueltig&: print tm&,"ms"
 else :print "<abgebrochen>":clear ungueltig&
 Endif
 
 
 hold:
 sound 2000,60
 Waitinput 7000:casenot %wmTimer:goto "hold"
 
 END
 


____
Ein richtiges Problem hat keine Lösung, nur Näherungen!

Nachricht bearbeitet (12.01.19 19:15)

Beitrag beantworten
 
 Re: Messageloop direkt aufrufen: LÖSUNG GEFUNDEN!
Autor: Jens-Arne Reumschüssel (---.dip0.t-ipconnect.de)
Datum:   14.01.19 19:32

Hallo,

herzlichen Dank für den Test! Daran kann man den Effekt tatsächlich sehr deutlich sehen. Noch etwas eindrucksvoller wird das, wenn man die ebenfalls recht langsamen Textmode-Befehle weglässt und stattdessen settext für ein Static benutzt:

 WindowTitle "Messageabholendes Waitinput beschleunigt:"+\
  "     Lösung von Jens-Arne Reumschüssel testen"
  '(CL) CopyLEFT 2019-01 by P.Specht, Vienna/AT/EU
  'erweitert von Jens-Arne Reumschüssel
  
  CLS:Randomize:font 2
  declare n&,tm&,txt$,ungueltig&,hT&
  
  $IFNDEF COMPILER
  txt$="INTERPRETER"
  n&=2500
  $ELSE
  txt$="COMPILER"
  n&=4000
  $ENDIF
  
  AppendMenuBar 100," "+txt$+" zählt bis "+str$(n&)+\
  ".     ESC-Taste soll erkannt werden und zerstört den laufenden Test!"
  hT&=@create("TEXT",%HWnd,"",200,200,50,20)
  
  
  print "\n OHNE Beschleunigung:",
  waitinput 3:sound 200,20:ungueltig&=0
  tm&=&GetTickCount
  Whileloop n&:settext hT&,@str$(&loop)
    waitinput 3
    :if %Key="27":ungueltig&=1:break:endif
  Endwhile
  tm&=&GetTickCount-tm&
  ifnot ungueltig&: print tm&,"ms"
  else :print "<abgebrochen>":clear ungueltig&
  Endif
  
  
  print "\n NUR Fastmode:",
  waitinput 3:sound 200,20:ungueltig&=0
  tm&=&GetTickCount
  set("Fastmode",1)
  Whileloop n&:settext hT&,@str$(&loop)
    waitinput 3
    :if %Key="27":ungueltig&=1:break:endif
  Endwhile
  set("Fastmode",0)
  tm&=&GetTickCount-tm&
  ifnot ungueltig&: print tm&,"ms"
  else :print "<abgebrochen>":clear ungueltig&
  Endif
  
  
  print "\n NUR MIT rnd()-Chance:",
  waitinput 3::sound 200,20:ungueltig&=0
  tm&=&GetTickCount
  Whileloop n&:settext hT&,@str$(&loop)
    if rnd()>0.95
      waitinput 3
     :if %Key="27":ungueltig&=1:break:endif
    endif
  Endwhile
  tm&=&GetTickCount-tm&
  ifnot ungueltig&: print tm&,"ms"
  else :print "<abgebrochen>":clear ungueltig&
  Endif
  
  
  print "\n LÖSUNG von Jens-Arne R.: Fastmode mit %PeekMessage:",
  waitinput 3:sound 200,20:ungueltig&=0
  tm&=&GetTickCount
  set("Fastmode",1)
  Whileloop n&:settext hT&,@str$(&loop)
    if %PeekMessage
      waitinput 3
      :if %Key="27":ungueltig&=1:break:endif
    Endif
  Endwhile
  set("Fastmode",0)
  tm&=&GetTickCount-tm&
  ifnot ungueltig&: print tm&,"ms"
  else :print "<abgebrochen>":clear ungueltig&
  Endif
  
  
  print "\n OHNE JEDE ABFRAGE:",
  waitinput 3:sound 200,20:ungueltig&=0
  tm&=&GetTickCount
  Whileloop n&:settext hT&,@str$(&loop)
  '
  Endwhile
  tm&=&GetTickCount-tm&
  ifnot ungueltig&: print tm&,"ms"
  else :print "<abgebrochen>":clear ungueltig&
  Endif
  
  
  sound 2000,60
  Waitinput
  
  END
 


Und wenn man die settext-Befehle auskommentiert, wird es ganz heftig: Dann dauert %peekmessage um die 50ms und ohne jede Abfrage 1-2ms (im Compiler und auf meinem zugegeben ziemlich schnellen Rechner). Das zeigt die wahre Verzögerung von waitinput 3 am plastischsten.

Beste Grüße, Jens-Arne

Beitrag beantworten
 
 Re: Messageloop direkt aufrufen: LÖSUNG GEFUNDEN!
Autor: p. specht (---.aon.at)
Datum:   14.01.19 19:40

Spitze! Das löst ein uraltes Problem bei mir!

Leider wird in der XPr11-Hilfe nur einzeln zu %PEEKMESSAGE berichtet. Es sollte unter "Siehe auch: " bei Fastmode vorkommen. Ich weiss allerdings nicht, ob das in X3 und X4 nicht längst behoben ist.

Gruss!

____
Ein richtiges Problem hat keine Lösung, nur Näherungen!

Beitrag beantworten
 
 Re: Messageloop direkt aufrufen: LÖSUNG GEFUNDEN!
Autor: Jens-Arne Reumschüssel (---.dip0.t-ipconnect.de)
Datum:   14.01.19 19:49

Was ich dabei übrigens ziemlich merkwürdig finde, ist der Umstand, dass &gettickcount offensichtlich eine 1ms-Auflösung hat, obwohl das mit dem Timer bekanntlich nicht möglich ist. Es gibt auf heute fast jedem Rechner allerdings einen high resolution timer (API QueryPerformanceCounter), aber der wird für den normalen Timer von Windows leider nicht verwendet, wohl auch, weil er nicht auf jedem System gleich oder überhaupt funktioniert. Für &gettickcount offenbar schon.

Gruß, Jens-Arne

Beitrag beantworten
 
 Re: Messageloop direkt aufrufen: LÖSUNG GEFUNDEN!
Autor: Jens-Arne Reumschüssel (---.dip0.t-ipconnect.de)
Datum:   14.01.19 20:45

Hallo,

das ist in der aktuellen Hilfe immer noch so. Aber wir arbeiten hier ja auch an einem wahrscheinlich relativ exotischen Problem, das nur auftritt, wenn man sich intensiv mit API-Programmierung und insbesondere Callback/Subclassing beschäftigt.

Beste Grüße, Jens-Arne

Beitrag beantworten
 Foren-Liste  |  Baumstruktur   Neuerer Beitrag  |  Älteres Thema 


 Foren-Liste  |  Zur Registrierung 
 Benutzerlogin
 Benutzername:
 Passwort:
 Login-Daten speichern:
   
 Passwort vergessen?
E-Mail-Adresse oder Username unten eingeben. Dann wird Dir per e-Mail ein neues Passwort zugeschickt.

phorum.org