Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi QueryPerformanceCounter - Probleme, Zeitversatz (https://www.delphipraxis.net/161723-queryperformancecounter-probleme-zeitversatz.html)

TERWI 17. Jul 2011 18:29

QueryPerformanceCounter - Probleme, Zeitversatz
 
Hab heute mal wieder mein altes Proggie zum lesen von IF-Fernbedienungen rausgekramt, weil es da wieder was zu tun gibt.
Ist so was ähnliches wie WinLIRC - nur finde ich, dass es mir besser gelungen ist ... :oops:

Vor gut 2 Jahren lief das noch einwadnfrei - u.a. Als FB-Empfänger auf meinem alten HTPC.
Heute nur Stress, liefert überwiegend wirres Zeugs bei den Signal-Timings - sogar negative Werte !
Noch verrückter ist, dass es Sprünge/Versätze von gut 4-7 mS (in meinem Fall eine 'Ewigkeit') gibt.

Lange Rede, kurzer Sinn - ich bin dank DP [eeeendlich] drauf gekommen !
Irgendwo hatte ich gelesen, das QueryPerformanceCounter Probleme macht mit MultiCore-CPU.
Ein kurzer Klick im Taskmanager und schon ist Ruhe im Karton mit nur einer CPU !

Man kann das recht schön beobachten, wie mal für ein paar Signale CPU-1 verwendet wird und dann wieder CPU-2.
Besagt Unterschied von ca. 4-7 mS muss wohl Zeitdifferenz zwischen den beiden CPU's liegen.
Verstehen zue ich das nicht wirklich, weil der Apparat hier eigentlich die ganze Zeit schläft und AUslastung gegen 0 geht.

Frage(n):
Wie kann das ? Ich hatte damals beim proggen auch schon die gleiche Maschine und da fiel das nicht auf.
Delphi 7 (ja ich weiß - Steinzeit. Für mich reichts alle male...) ist auch noch das gleiche.

Gibt's da irgendeinen Patch, ne andere Lösung ?
Falls nicht, wie kann ich dem Proggie sagen, das es nur 1 CPU nutzen soll ?

Wäre dankbar für einige Tipps.

rollstuhlfahrer 17. Jul 2011 18:36

AW: QueryPerformanceCounter - Probleme, Zeitversatz
 
Wie du deinem Programm sagen kannst, dass es nur 1 CPU verwenden soll? - Genauso wie TaskManager/ProzessExplorer das auch machen: MSDN-Library durchsuchenSetProcessAffinityMask.

Bernhard

TERWI 17. Jul 2011 18:56

AW: QueryPerformanceCounter - Probleme, Zeitversatz
 
Mit dem richtigen Suchbegriff bin ich u. a. auch Hier drüber gestolpert.
Sozusagen das gleiche Prob.
.... und Hier noch eins zum gleichen Thema
Irgendwie scheine ich im Moment aber zu dumm zum finden eines Codeschnipsel zu sein, mit dem ich das bewerkstelligen kann ...

rollstuhlfahrer 17. Jul 2011 19:58

AW: QueryPerformanceCounter - Probleme, Zeitversatz
 
Nun ja, du brauchst ja nicht fiel zu wissen:
a) Dein Prozess-Handle und
b) den/die Kern(e), auf denen dein Programm laufen soll. Wenn es nur auf einem laufen soll, empfiehlt sich, den ersten zu benutzen, da der eh immer da ist.

Heißt also:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetProcessAffinity(GetProcessHandle(), 1);
end;
Bernhard

TERWI 17. Jul 2011 20:53

AW: QueryPerformanceCounter - Probleme, Zeitversatz
 
Na ja, ganz so einfach geht es auch nicht, aber ...
... hab mir Hier was passendes rausgesogen.
Nun funzt das - wie mit per Hand eingestellt - wie die Wutz !

Wenn ich mal so die 'echten' Timings div. FB-Typen (Philips RC5/6, NEC, Sony, DBox) ansehe und mit meiner Leseroutine vergleiche, habe ich eine Abweichung von +/- max. 30µS (ja: Mükro !). Schon extrem gut.

Nur scheint noch irgendwas anderes zu stören :roll:
Starte ich meine DVB-App, geht das geeiere wieder los.
Auch wenn ich beide auf verschiedene CPU's stelle.

Ich betreibe den IR-Empänger übrigens an einem 'echten' COM-Port.
Hab hier noch 2x COM-USB- Adapter, davon will aber keiner.
DSR-Leitungen scheinen die wohl nicht zu supporten ...

himitsu 17. Jul 2011 21:44

AW: QueryPerformanceCounter - Probleme, Zeitversatz
 
Du könntest auch statt QueryPerformanceCounter einen Multimedia-Timer verwenden. (Bei Google suchenMultimedia Timers / Bei Google suchenDelphi Multimedia Timers)
Unter diesem Begriff werden verschiedene Timer/Zähler geführt, mit höheren Auflösungen arbeiten (z.B. für die Spiele, Musik oder Videos)


Ganz kraß sah man sowas beim "Time Stamp Counter" Bei Google suchenRDTSC, welcher direkt mit dem CPU-Tack lief ... pro Kern.
Wobei inzwischen viele CPU-Hersteller diese Counter (leider) vom CPU-Takt trennen (bei dynamisch getakteten CPUs lief sowas auch noch unterschiedlich schnell, je nach CPU-Auslastung).

TERWI 18. Jul 2011 07:37

AW: QueryPerformanceCounter - Probleme, Zeitversatz
 
Problem scheint wohl offensichtlich zu sein, dass alle (anderen) Timer zu langsam sind. :(
Ich muss schon eine Auflösung von max. ( ! ) 250 µS haben, um die Timings unterschiedlicher IR-FB-Typen noch so eben auflösen zu können.
Mit Timer-Auflösungen >= 1 mS ist da leider (gar) nichts zu machen.

Wie gesagt geht das mit dem QPC ganz hervorragend - wenn man die Anwendung auf einen Kern setzt. :-D
Aber:
Was tun, wenn das ganze in einer DLL / Plugin als Child in einem Programm läuft, was es von der Performance her 'nicht so witzig' finden würde, wenn man die CPU-Power beschränkt ?

Ein Ansatz wäre, jedes mal beim Auslesen des Counters die CPU definiert zu setzen und dann gleich wieder zurück zu setzen.
Oder halt so lange auf einer CPU 'sitzen' zu bleiben, bis das FB-Signal fertig gelesen ist....

Irgendwie kann ich mir vorstellen, dass das z.B. bei DVB-Anwendungen mit HD-Signal oder anderen Power-Intensiven Anwendung doch sicher zum stottern im Bildfluß führen wird - also sicher nicht die pralle Lösung. :roll:

2. Idee wäre, das ganze in einen Thread zu packen und diesen dann definiert einer CPU zuzuweisen - mit ggf. dann höchster gesetzter Priorität. :cyclops:
Könnte mir vorstellen, dass das geht - aber wie ?
Ich bin da nicht so der Held ....

Jemand vielleicht noch ne andere Idee ?

PS:
In diesem Fred ist die Erklärung sehr gut gegeben, warum.
Nur leider auch noch keine Lösung ...

PS-2:
Der in v.g. Fred beannte MS-Artikel ist jetzt hier nachzulesen.
... ich studiere ihn gerade ...

hathor 18. Jul 2011 09:12

AW: QueryPerformanceCounter - Probleme, Zeitversatz
 
Ich finde eine Hardwarelösung mit Microcontroller besser.

http://ww1.microchip.com/downloads/e...otes/00657.pdf

http://www.mikrocontroller.net/articles/IRMP

Wenn man alles von einer CPU (Desktop, Notebook) machen lässt, stellt man früher oder später fest, dass eine betriebssystemunabhängige Lösung besser ist.
Die IR-Auswertung (vor allem die Loops) treiben die CPU-Last nach oben.

Offtopic:
Das beste Beispiel ist ein Satelliten-Empfänger (DVB-S) mit PVR-Funktion.
Die eingebaute HDD funktioniert fehlerfrei, aber eine USB-HDD blockiert die ganze Bedieneinheit:
Das Gerät funktioniert nicht direkt auf Befehle (oder nur zufällig):
- kurz nach dem Einschalten, weil dann die USB-HDD gesucht und gelesen wird
- beim Abspielen von Aufzeichnungen von der USB-HDD

himitsu 18. Jul 2011 09:44

AW: QueryPerformanceCounter - Probleme, Zeitversatz
 
Einige Mainboards haben sogar schon einen IR-Empfänger an Board (oftmals fehlt nur noch die Empfängerdiode :stupid: ) ... ein Blick ins Handbuch des Boards kann das klären.

Zitat:

Was tun, wenn das ganze in einer DLL / Plugin als Child in einem Programm läuft, was es von der Performance her 'nicht so witzig' finden würde, wenn man die CPU-Power beschränkt ?
Man kann nicht nur ganze Programme an Kerne binden, sondern kann das auch geziehlt für einzelne Threads machen.

himitsu 18. Jul 2011 09:47

AW: QueryPerformanceCounter - Probleme, Zeitversatz
 
delete


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz