AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Alternative zu SLEEP

Ein Thema von qb-tim · begonnen am 7. Apr 2006 · letzter Beitrag vom 10. Apr 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Evian
Evian

Registriert seit: 10. Apr 2003
Ort: Berlin
485 Beiträge
 
Delphi 6 Professional
 
#11

Re: Alternative zu SLEEP

  Alt 7. Apr 2006, 15:18
Zitat von himitsu:
Zitat von Evian:
Delphi-Quellcode:
for i := 1 to 1500 do
  BEGIN
    sleep(1);
    application.ProcessMessages;
  END;
da gibt es sicher noch elegantere Sachen, aber es funtzt auf jeden Fall.
ProcessMessages braucht Zeit und Sleep mit einer Millisekunde = unmöglich.

Also dürfte da wohl mehr als 1,5 Sekunden rauskommen
ja wie gesagt elegant war es natürlich nicht.. och man jetzt schäme ich mich total wegen meinem Code.. danke !

Edit: war nen Spaß! ^^
-> www.Phillsoft.de

Ich bin nun Mathematiker, aber meine Freundin bleibt trotzdem unberechenbar!
  Mit Zitat antworten Zitat
Benutzerbild von Evian
Evian

Registriert seit: 10. Apr 2003
Ort: Berlin
485 Beiträge
 
Delphi 6 Professional
 
#12

Re: Alternative zu SLEEP

  Alt 7. Apr 2006, 15:18
Zitat von Khabarakh:
Zitat von Evian:
nice! gefällt mir sogar noch besser, als der Code von Hagen
Ist mein Ironiedetektor kaputt oder ist das wirklich ernstgemeint o.O ?
ne ehrlich, es an der Systemzeit festzumachen find ich ne coole Idee..
-> www.Phillsoft.de

Ich bin nun Mathematiker, aber meine Freundin bleibt trotzdem unberechenbar!
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.838 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

Re: Alternative zu SLEEP

  Alt 7. Apr 2006, 16:07
Zitat von Evian:
Zitat von Khabarakh:
Zitat von Evian:
nice! gefällt mir sogar noch besser, als der Code von Hagen
Ist mein Ironiedetektor kaputt oder ist das wirklich ernstgemeint o.O ?
ne ehrlich, es an der Systemzeit festzumachen find ich ne coole Idee..
Hagen macht es doch auch an der Systezeit fest.
Oder was denkst Du was GetTickCount macht?
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: Alternative zu SLEEP

  Alt 7. Apr 2006, 17:08
@shima:

das ist eine sehr gute Idee, aber wenn dann so

Delphi-Quellcode:
  while not Application.Terminated and
        (Milliseconds > 0) and
        (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
  begin
    Application.ProcessMessages;
    Milliseconds := Tick - GetTickcount;
  end;
Allerdings entspricht das nun nicht mehr EXAKT dem Verhalten was der Name der Funktion suggeriert.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: Alternative zu SLEEP

  Alt 7. Apr 2006, 17:14
@Mabuse:

mit dem Unterschied das ich nicht ständig einen leeren Messagequeue mit der sehr langsammen Funktion Application.ProcessMessages permanent polle. Stattdessen warte ich per API brav bis das OS mir per Ereignis mitteilt das es Messages abzuarbeiten gibt. Falls dies nicht der Fall ist wird der Thread komplett schlafen gelegt, also so wie wenn man Sleep() aufrufen würde. Defakto ist meine Funktion nichts anderes wie ein Sleep() aber mit dem Unterschied das vorzeitig bei Bedarf dieses "Sleep" beendet wird um Nachrichten empfangen zu können.

Das einfache Pollen in einer Schleife kostet dagegen viel mehr Rechenzeit. probiers einfach aus und vergleiche beide Methoden indem du mal 10 Minuten warten lässt. Du öffnest den taskmanager und vergleichst die CPU Auslastung.

Naja, steht aber eigentlich alles im verlinkten Thread. Davon abgesehen, sieht mein Source so aus wie der andere ?

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.838 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

Re: Alternative zu SLEEP

  Alt 10. Apr 2006, 08:40
Zitat von negaH:
@Mabuse:...Naja, steht aber eigentlich alles im verlinkten Thread. Davon abgesehen, sieht mein Source so aus wie der andere ?
Ich habe schon verstanden was Dein Code macht, ich wollte Evian nur darauf aufmerksam machen, das Du auch den Zeitgeber des Rechners verwendest.

Dein Code gefällt mir sehr gut. Wenn ich nochmal ein Sleep brauche werde ich es warscheinlich genau so machen.
In der Vergangenheit habe ich meist auch nur eine Schleife al la "while zeit>now do application.processmessages;" verwendet. Aber Deine Methode ist eleganter
Die Rechner werden zwar immer schneller, deswegen achten viele Programmierer nicht mehr so auf effizienten Code. Aber es gibt ja auch noch PCs unterhalb der 1000MHz Marke. (Ich verwende z.B. zuhause auch nur einen P3 500.)
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: Alternative zu SLEEP

  Alt 10. Apr 2006, 16:41
@Mabuse,

das ist ein zu einfacher Vergleich. Wichtig ist der Punkt in welchem Kontext meine Delay() Funktion aufgerufen wird.

Das ordinäre Sleep() lässt einen beliebigen Thread für Millisekunden schlafen. Es gibt aber nun Threads die einen Messagequeue installieren und solche die keinen haben. Der Mainthread eines Prozsses zb. hat eine Nachrichtenschleife ein davon abgespalteter Thread "meistens" nicht.

Eine ordinäre Schleife per GetTickCount() und Application.ProcessMessages würde sich demnach unterschiedlich verhalten jenachdem in welchem Thread sie aufgerufen würde. Defakto sollte man sogar so einen Schleife niemals aus einem abgespalteten Thread heraus aufrufen, da sie nämlich im grunde nicht Threadsafe ist.

Das Delay() verhält sich dazu im Gegensatz entsprechend den Gegebenheiten. In einem Thread ohne Messagequeue verhält es sich fast exakt wie Sleep(), es wartet, kann aber unterbrochen werden wenn der besagte Thread massiv von aussen terminiert wird !
In einem Mainthread zb. würde das Warten immer dann unterbrochen werden wenn zb. der Anwender Messages produziert indem er zb. die Maus über die Formulare bewegt, usw. Die Anwendung friert also nicht ein, noch verbraucht sie unnötig viel Rechnerzeit indem sie unnötig pollt.

Fazit: beide Methoden sind nicht miteinander vergleichbar, es ist sichtbar unterschiedlicher Source, weil sie logisch unterschiedliche Aufgaben erfüllen.

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 09:16 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