AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

Ein Thema von DelphiManiac · begonnen am 2. Aug 2007 · letzter Beitrag vom 3. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2   
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#1

Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

  Alt 2. Aug 2007, 17:42
Die Frage ist eigentlich schon im Titel erklärt.

Hintergrund ist folgender:

Ich habe eine Software die die Sleep Funktion nutzt,
diese ist auf einem anderen Rechner sehr viel langsamer (Kommunikation wird damit gesteuert),
lass ich mir die Werte (Erhöhung eines Zählers) anzeigen, dann läuft dieser wirklich um das 3 fache langsamer


Ist das so, oder hat das andere Gründe?

Gruß
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#2

Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

  Alt 2. Aug 2007, 18:04
Hallo,
Ein Sleep(1) heißt nur, dass mindestens eine Millisekunde gewartet wird. Was passiert ist folgednes:
- Der Main-Thread für dein Prog wird für 1ms schlafen gelegt
- Danch wacht er wieder auf
- Je nachdem, was ansonsten noch passiert, kanns aber sein, dass der Thread noch nicht gleich wieder dran kommt, weil andere Threads auch noch was arbeiten wollen

==> Es besteht nur die Garantie, dass der Thread nicht wieder aktiv wird, bevor die 1ms abgelaufen sind.

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

  Alt 2. Aug 2007, 18:09
Ein Sleep(1) braucht immer mehr als 1 ms, da ja im Hintergrund ein Taskwechsel stattfindet.
Es wird min. die Robin-round time slice "verbraten".
Unter 50ms muss man mit prozentual grossen Abweichungen rechnen.
Bei einem Sleep(1000) muss man mit min. 50ms Abweichung rechnen.
Andreas
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

  Alt 2. Aug 2007, 20:00
Moin DelphiManiac,

um shmias Ausführungen noch etwas zu verdeutlichen:

Sobald Sleep aufgerufen wird, gibt der aufrufende Thread die ihm zustehende Rechenzeit ab, und bekommt erst, wenn er "turnusmässig" wieder dran ist, neue Rechenzeit zugeteilt.
Soll heissen: Selbst ein Sleep(0) hat verzögernde Wirkung.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

  Alt 2. Aug 2007, 21:21
Windows hat intern einen Heartbeat-Timer der auf deutlich mehr als 1 msec laueft. Das ist die Mindestzeit die bei Sleep(1) vergeht. Gemeinerweise kann dieser Timer auf 1 msec gestellt werden. Es kann also passieren das ploetzlich alles schneller geht (einschliesslich Treibern) nur weil ein Programm mit Miltimedia-Sachen hantiert.
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#6

Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

  Alt 2. Aug 2007, 21:24
@all:

Ja stimmt, der Prozess (bei mir der Ganze Prozess, da es nur einen Thread gibt)
gibt seine Prozessorzeit ab und ist für min. 1 ms nicht Zuteilungsfähig,
er kann also erstwieder nach 1 ms. vom OS mit Prozessorzeit zugewiesen bekommen.

Gut, wie kann ich denn meinem Prozess eine höhere Priorität geben, bzw.
wie kann ich sicherstellen, dass mein Prozess nach 1 ms wieder aktiv wird?

Da es bei einigen Systemen sehr große unterschiede gibt, so, dass die Kommunikation auf den Systemen nicht
ordnungsgemäß läuft...

Danke euch!
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

  Alt 2. Aug 2007, 21:28
Probiers doch mal damit:
Delphi-Quellcode:
for i := 0 to 100 do
asm
  NOP;
end;


Im Ernst: Wozu möchtest du unbedungt eine Pause von einer Millisekunde erzwingen??

Falls du die Kommunikation direkt beeinflussen kannst, überdenke das ganze. Wenns sowas wie n com Port ist (kenn mich da null aus) dann benutz queryperformace -counter und -frequency. In einer while-Schleife solltest du damit ein wenig Leerlauf (= Pause) erzeugen können
  Mit Zitat antworten Zitat
BBG
(Gast)

n/a Beiträge
 
#8

Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

  Alt 2. Aug 2007, 21:29
Zitat:
sicherstellen, dass mein Prozess nach 1 ms wieder aktiv wird
Nach exakt 1ms? Ich behaupte: unmöglich.

Zitat:
meinem Prozess eine höhere Priorität geben
Luckie hat dazu mal ein Tutorial geschrieben, bzw. über Threads --> guckst du hier
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

  Alt 2. Aug 2007, 23:03
Verabschiede dich von deinem Konzept. Windows ist kein Echtzeitbetriebssystem. Nichts aber wirklich gar nichts kann dir garantieren, dass dein Prozess nach einer ms wieder die CPU zugeteilt bekommt, auch nicht eine höhere Priorität. Im Gegenteil, eine höhere Priorität könnte dein ganzes System instabil wwerden lassen. Wenn man der Meinung ist, dass sein Programm eine höhere Priorität benötigt, dann ist meist etwas am Design falsch. Hinzukommt, dass die kleinste mögliche Auflösung des normalen Timers bei 15 ms liegt und unter Consumer Windows bei ca. 50 ms.

Anstatt irgendwas ständig zu pollen, solltest du dich benachrichtigen lassen. Aber das sind nur Vermutungen, deswegen die Frage: Was hast du vor? Wozu brauchst du das?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#10

Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?

  Alt 3. Aug 2007, 08:49
Nunja,

das Design meiner Kommunikationstruktur ist an der Stelle nicht ganz sauber, müsste
mit Events arbeiten und mich benachritigen lassen.

Hier geht es um ein Frage Antwort Spiel (d.h. es muss definitiv auf die Antwort (oder Timeout) gewartet werden..)

Werde das bei meinem nächsten Projekt umstellen, und werde dann mal den Quelltext posten, so
das wir hier diskutieren können wie man es optimiert.

Aber trotzdem finde ich die Abweichungen, die ich habe schon heftig,


Wie gesagt angenommen ich habe soetwas

Delphi-Quellcode:
// Ist nur ein Beispiel:
for I := 0 to 5000 do
begin
  Sleep(1);
end;
Dann dauert es auf meinem P4 ungefähr 5,5 - 6 sec

und auf einem Athlon XP 2000 mit Windows XP (frisch aufgesetzt ohne Service Pack2)
13-14 sec....

das Sleep(1) nicht genau eine ms dauert ist mir ja klar,
aber, dass sich die Abweichung so aufsummiert

Gruß
DelphiManiac
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 07:55 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