AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?
Thema durchsuchen
Ansicht
Themen-Optionen

Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

Ein Thema von Andy386 · begonnen am 18. Jul 2008 · letzter Beitrag vom 19. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
Andy386

Registriert seit: 26. Mär 2008
55 Beiträge
 
#1

Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

  Alt 18. Jul 2008, 11:18
Hallo,

ich habe mittlerweile ein grösseres Programm "fertig", mit einigen Threads. Einer holt Daten von der Messkarte, einer überprüft auf Eingaben , einer macht Datenauswertung und ein anderer Datenausgabe.
Ist also alles recht übersichtlich, objektorientiert, threadgelagert usw.
DatenHolen hat Prio mittel (z.Zt. kein sleep), Eingabe mittel (mit grösserem sleep), Auswertung mittel (mit sleep) und Ausgabe low (mit kleinem sleep)

Nun mein Problem: Der DatenHol-Thread braucht 1.3 ms für einen Durchlauf. Das ist soweit OK, er könnte auch etwas langsamer sein. Er muss sogar etwas langsamer sein, da der Ausgabethread fast nie dran kommt. Ich dachte dabei an ein sleep(1).
Aber damit braucht er nicht die (im Kopf errechneten 2.3 ms, sondern etwas über 7 ms ! Das ist wieder zu langsam...

Ich denke am dll-Aufruf vom sleep wird es nicht liegen, da der Thread mit einem sleep(0) auch nur etwas um 1.3ms braucht.
Ich bin echt kurz vor dem Verzweifeln: Alles fertig, und jetzt kann ich den einen nicht vom Prozessorkern vertreiben !

Hat jemand von euch Erfahrung mit dem Problem, kennt eine Alternative oder hat vielleicht sogar eine sleep(1)-dll ?

Vielen Dank schon mal im Vorraus !
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

  Alt 18. Jul 2008, 11:37
Du verwendest Windows. Kein System, das für zeitkritische Anwendungen ausgelegt ist. Das ist mit präemptivem Multitasting auch nicht möglich.
Die einzige Lösung ist folglich, das Design zu ändern.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

  Alt 18. Jul 2008, 11:39
siehe Zitat:
http://www.delphipraxis.net/internal...=668766#668766

Sleep verwendet intern GetTickCount und dieses bietet keine millisekundengenauen Zeitwert.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#4

Re: Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

  Alt 18. Jul 2008, 11:43
Das Sleep gibt die Ausführung des Threads an den Windows Scheduler ab. Ich hatte vor einer Zeit mal gemessen wie lange ein sleep(1) wirklich braucht und dort kamen Werte von 0.95 bis 1.95 raus. Allerdings hatte mein System auch überhaupt keine Last! Ich vermute fast, dass bei deinem System dann aber gerade etwas gemacht wird und der Thread dann vom Sheduler nach hinten gestellt wird. Dann dauerts länger als 1 Millisekunde. Bei einem Sleep(0) wird der Scheduler "angewiesen" zu schauen ob jemand anderes auch etwas machen will. Wenn dies nicht der Fall ist, dann kehrt der Sleep Befehl sofort zurück anderenfalls kann auch dieser 2-3 Millisekunden dauern.

Ich denke es könnte schon helfen, wenn du die Priorität des Threads um eine oder zwei Stufen erhöhst. Denn dann wird der Scheduler deinen Messthread nicht hinter andere Stellen. Allerdings sollte so etwas sehr gut überlegt sein!

Wobei sich mir die Frage stellt worauf legst du da Priorität. Beim Daten messen (also, dass immer im selben Zeitabstand gemessen wird)? Oder müssen die Daten auch immer sofort ausgewertet werden? Also die gemessen ergebnisse dürften nicht gecacht werden, weil das keinen Sinn machen würde.

Denn wenn du die Daten Messen und sofort auswerten musst könntest du dir evtl einen Thread sparen. Wenn es "egal" ist, wann die Daten ausgewertet werden, dann liegt die Prio ja ganz klar beim Messen. Evtl könntest du auch etwas anderes zum Warten benutzen. So etwas wie Events (nicht TNotifyEvent) warten bis ein Timeout eintrifft oder das Event gesetzt wird. Das könnte auch schon nach 0.5 Millisekunden der Fall sein. Halt wann der Gegenpart das Event setzt.
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat
Andy386

Registriert seit: 26. Mär 2008
55 Beiträge
 
#5

Re: Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

  Alt 18. Jul 2008, 12:03
@Lossy eX
Vielen Dank für die Vorschläge !
Der Anzeige-Thread ist halt nicht so wichtig, wenn ich den erhöhe, ist er gleich mit den anderen, d.h. wenn man viel anzeigen will (oder etwas neues), gehen die anderen mit in die Knie. Das ist aber nicht das gewünschte, da die Daten von der Karte extrem schnell kommen (und dann vom DatenHolenThread (nach Treiberaufruf) gleich gecacht werden). Der Auswerte kann auch noch langsamer sein, der hat an einigen Stellen bereits ein paar Sleeps bekommen, aber das nützt dem Ausgabethread nix, da der DatenHol-Problem-thread nie ein sleep hat...

wie macht man das mit den Events ? Bin noch Delphi-noob


Zitat von himitsu:
If you need a higher resolution timer, use a multimedia timer or a high-resolution timer.
Ah, da ist ja ein Ansatz...
Einen solchen timer habe ich schon gemacht/kopiert (um die genaue Threadlaufzeit zu ermitteln...), hab nicht dran gedacht, dass sleep den selben langsamen Timer nimmt wie now & Co.

Aber... habe ich dann viel gekonnt, wenn ich so was wie
Delphi-Quellcode:
jetzt:=now_genau;
while now_genau < (jetzt+1) do
     sysutils.sleep(0);
     //bzw.: Application.ProcessMessages;
nehme, ich mein, dann hat ja der Thread permanent zu tun mit Zeit berechnen...

Oder nützt es was, dass als niederprioren Thread zu machen, der einen interrupt wirft ? Kann man dass überhaupt in XP/Vista machen? Wenn ja, gibt's ein Tutorial für Anfänger dazu ?


[edit] oder vielleicht so:
Delphi-Quellcode:
while now_genau < (jetzt+1) do
begin
     sysutils.sleep(0);
     sysutils.sleep(0);
     sysutils.sleep(0);
     sysutils.sleep(0);
     sysutils.sleep(0);
     sysutils.sleep(0);
     sysutils.sleep(0);
     sysutils.sleep(0);
     sysutils.sleep(0);
     sysutils.sleep(0);
     sysutils.sleep(0);
     sysutils.sleep(0);
end;
Sorry, kenn den Befehlt für spoiler nicht !
[/edit]
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

  Alt 18. Jul 2008, 12:16
Du wirst es imho einfach nicht schaffen, das eine App genau xyz millisekunden wartet.

Wenn Du jedoch absolut konstante Abstände in den Messwerten benötigst, dann musst Du eben etwas rumtricksen (a.k.a. lineare interpolation)
Als ich mich früher damit beschäftigt habe, war es so, das die Messkarte im Rechner die zeitkritischen Messungen für mich übernommen hat.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Andy386

Registriert seit: 26. Mär 2008
55 Beiträge
 
#7

Re: Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

  Alt 18. Jul 2008, 12:39
Achso, darauf lief die Frage hinaus !
Ne, genau gleicher Abstand muss nicht sein, ich will nur etwas Zeit fürs Zeichnen bekommen...
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

  Alt 18. Jul 2008, 13:02
Zitat von Andy386:
Achso, darauf lief die Frage hinaus !
Ne, genau gleicher Abstand muss nicht sein, ich will nur etwas Zeit fürs Zeichnen bekommen...
Also ich würde die Threads nicht zeitgesteuert arbeiten lassen, das ist zu unzuverlässig / ungenau.

Warum pumpst Du die Daten (Messwerte) nicht vom "Messthread" zum "Anzeigethread" per namedPipe (oder sonst was)?
Der Messthread wartet dann, bis der Anzeigethread die Daten verarbeitet hat und wieder Rückmeldung gibt.
Somit bist Du eventgesteuert und auf der sicheren Seite.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

  Alt 18. Jul 2008, 13:22
Soweit ich weiß sind Zeitscheiben normalerweise 10ms lang, also 1ms warten geht sowieso nur, wenn man keinen anderen Thread hat, der länger als ein paar Mikrosekunden rechnet.

Wenn man es wirklich exakt haben will, könnte man es mit einer for-Schleife und einem QPC probieren, muss dann aber noch sicherstellen, dass die Anwendung auch auf keinen Fall währenddessen unterbrochen wird. (was nicht geht, außer vielleicht indem man die Threadpriorität auf Runtime setzt, aber auch da wird es wohl nicht in allen Fällen gehen)
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#10

Re: Threadproblem - sleep(1) braucht ca. 5 ms! Warum ?

  Alt 18. Jul 2008, 13:26
MMTimer, Multi Media Timer verwenden, der muß exakt sein. Das bedeutet aber auch das deine MMTimer Callback Funktion gewissen kritischen Anforderungen genügen muß.

Gruß Hagen
  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 22: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