AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Event - Latenz

Ein Thema von TomyN · begonnen am 18. Apr 2024 · letzter Beitrag vom 18. Apr 2024
Antwort Antwort
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
249 Beiträge
 
Delphi 10.3 Rio
 
#1

Event - Latenz

  Alt 18. Apr 2024, 15:56
Hallo,

Ich bin gerade über eine Sache gestolpert, die ich nicht so ganz nachvollziehen kann:
- Ich habe einen Thread mit Priorität tpNormal. Da ist ein waitForSingleObject(Event, ... ) drin.
- In meiner Anwendung setzte ich den Event ('Stinknormaler' Autoreste Event (aus der windows unit und nicht aus den syncObjs)
- Es dauert bis zu 20ms, bis der 'Event' ankommt, d.h. das waitFor 'durchschaltet'
- Der Thread braucht ca. 1 ms für einen Durchlauf
- Die Events kommen etwas im 10ms Raster, d.h. ab un zu wird ein Event 'verschlafen', was alles durcheinander bring

Ist das normal, übersehe ich was oder gibt es eine schnellere Möglichkeit der 'Threadalarmierung' ?

Freue mich über jede Idee

Tomy
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
124 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Event - Latenz

  Alt 18. Apr 2024, 16:39
Schau dir mal timeBeginPeriod an, die standardmäßige Zeitgeberauflösung unter Windows beträgt 15,625 ms.
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
249 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Event - Latenz

  Alt 18. Apr 2024, 16:47
Interessanter Gedanke, aber die Timerauflösung steht schon auf 1ms ....
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Event - Latenz

  Alt 18. Apr 2024, 17:15
* Windows ist kein RealTime-System
* du redest hier von 2 Threads, aber es gibt hunderte tausende Threads, welche sich eine homöopathische Dosis an CPU-Kernen teilen, wo jeder Thread "standardmäßig" ein paar Millisekunden abeitet und dann Pause macht

Es liegt in der Sache der Natur, dass der andere Thread somit ein bisschen braucht, bis er reagieren kann.

Zitat:
Der Thread braucht ca. 1 ms für einen Durchlauf
Wozu dann ein Thread?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (18. Apr 2024 um 17:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#5

AW: Event - Latenz

  Alt 18. Apr 2024, 17:42
wo jeder Thread "standardmäßig" ein paar Millisekunden abeitet und dann Pause macht
So eine Zeitscheibe (nennt sich Quantum) liegt bei einem Desktop-Windows (nicht Windows Server) wohl irgendwo zwischen 20 und 60ms. Dann kommen erstmal viele viele andere Threads von anderen Prozessen dran bevor wieder ein eigener Thread auf der SPU landet.

Bei einer Server-SKU soll so ein Quantum wohl relativ konstant bei 120ms liegen. Unixe/Linuxe schedulen wohl auch um die 100ms.
Das ganze sind ungefähre Angaben. Der Quellcode des Windows-Schedulers liegt nicht offen und Microsoft schweigt sich zu den exakten Zeiten aus.

Zitat:
Der Thread braucht ca. 1 ms für einen Durchlauf
Wozu dann ein Thread?
Genau. Warum dann ein Thread?
Wenn alle 10ms ein Event rein kommt, und das 1ms braucht zum abarbeiten, dann hat man 9ms nix zu tun. Die kann man natürlich mit Kommunikation zwischen den Threads füllen, effizient ist das aber nicht
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Event - Latenz

  Alt 18. Apr 2024, 18:58
Und dann kommt es auch drauf an, ob der andere Thread zufällig grade aktiv ist, bzw. kurz danach wird, oder ob er grade aktiv war und nun 'ne Weile weg ist.

Sleep und WaitFor sind aber nett und geben sofort die Ausführung an Windows zurück ... verbrauchen also nicht den komplett ihnen zustehende Slott, wodurch die anderen Threads somit schneller wieder dran kommen.
Da die meisten Threads meistens schlafen, muß somit kein Thread wirklich sehr lange warten, bis er wieder dran ist.

Soll ein Thread eine gewisse "schnelle" Aufgabe in einem Slott durchführen, dann könnte man kurz vorher ein Sleep(0) einfügen und danach arbeitet der Code von beginn des neuen Slotts, aber garantiert ist es "normal" dennoch nicht, dass es wirklich durcharbeitet, außer man fummelt noch bissl an der Priorität ud Co. rum, aber auch da ist nichts garantiert.

z.B. könnte man alle anderen Threads/Prozesse auf die anderen Kerne beschränken und den einen Thread alleinig an einen bestimmteh Kern binden ... grundsärzlich würde er dann durchlaufen (aber durch Treiber, Interrupts usw. könnte er dennoch unterbrochen werden).
Außerdem hat es die CPU/Windows nicht gern, wenn EIN Core brennt (durchackert), drum schubst z.B. Windows 11 vor allem die arbeitenden Threads alle 30 Sekunden zwischen den Cores hin und her, um die Wärmebelastung zu verteilen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (18. Apr 2024 um 19:04 Uhr)
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
249 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Event - Latenz

  Alt 18. Apr 2024, 19:09
Über windows und realtime kann man geteilter Meinung sein, was natürlich an der Definition von realtime hängt. So zeigt zum Beispiel SAC was unter windows möglich ist.
Warum ein Thread, ganz einfach, weil das SDK folgendes sagt:
Zitat:
directProcess suggests to the host whether it should immediately start processing
(directProcess == ASIOTrue), or whether its process should be deferred
because the call comes from a very low level (for instance, a high level
priority interrupt), and direct processing would cause timing instabilities for
the rest of the system. If in doubt, directProcess should be set to ASIOFalse.
Ich lese das so, dass ich informiert werde, dass Daten da sind und ich sie abholen soll. Alledings eben nicht in dieser (Interrupt?) Routine. Da dachte ich an Thread und Event. Gibt es andere Ideen (APC spukt mir durch den Kopf, aber da hab ich keine Ahnung davon) oder so wüste Gedanken wie ein Timer mit Routine o.ä.
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de

Geändert von TomyN (18. Apr 2024 um 19:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Event - Latenz

  Alt 18. Apr 2024, 20:09
Zitat:
Der Thread braucht ca. 1 ms für einen Durchlauf
Wenn das so schnell geht, warum dann überhaupt mit Threads, Asychron oder sonstwas anfangen?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:03 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