AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi QueryPerformanceCounter - Probleme, Zeitversatz
Thema durchsuchen
Ansicht
Themen-Optionen

QueryPerformanceCounter - Probleme, Zeitversatz

Ein Thema von TERWI · begonnen am 17. Jul 2011 · letzter Beitrag vom 18. Jul 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#1

QueryPerformanceCounter - Probleme, Zeitversatz

  Alt 17. Jul 2011, 19:29
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 ...

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.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

AW: QueryPerformanceCounter - Probleme, Zeitversatz

  Alt 17. Jul 2011, 19:36
Wie du deinem Programm sagen kannst, dass es nur 1 CPU verwenden soll? - Genauso wie TaskManager/ProzessExplorer das auch machen: MSDN-Library durchsuchenSetProcessAffinityMask.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: QueryPerformanceCounter - Probleme, Zeitversatz

  Alt 17. Jul 2011, 19:56
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 ...

Geändert von TERWI (17. Jul 2011 um 20:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#4

AW: QueryPerformanceCounter - Probleme, Zeitversatz

  Alt 17. Jul 2011, 20:58
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: QueryPerformanceCounter - Probleme, Zeitversatz

  Alt 17. Jul 2011, 21:53
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
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: QueryPerformanceCounter - Probleme, Zeitversatz

  Alt 17. Jul 2011, 22:44
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).
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: QueryPerformanceCounter - Probleme, Zeitversatz

  Alt 18. Jul 2011, 08:37
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.
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.

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

Geändert von TERWI (18. Jul 2011 um 09:58 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#8

AW: QueryPerformanceCounter - Probleme, Zeitversatz

  Alt 18. Jul 2011, 10:12
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

Geändert von hathor (18. Jul 2011 um 10:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: QueryPerformanceCounter - Probleme, Zeitversatz

  Alt 18. Jul 2011, 10:44
Einige Mainboards haben sogar schon einen IR-Empfänger an Board (oftmals fehlt nur noch die Empfängerdiode ) ... 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.
$2B or not $2B

Geändert von himitsu (18. Jul 2011 um 10:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: QueryPerformanceCounter - Probleme, Zeitversatz

  Alt 18. Jul 2011, 10:47
delete
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.
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