Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Sekunden in Millisekunden für Sleep umwandeln (https://www.delphipraxis.net/191991-sekunden-millisekunden-fuer-sleep-umwandeln.html)

a.def 11. Mär 2017 10:19


Sekunden in Millisekunden für Sleep umwandeln
 
Ich scheitere gerade wieder an einer eigentlich total einfachen Sache!
Ich habe ein Eingabefeld in welches man eine Zahl eingibt. z.B. 600 (Sekunden). Das wären dann 10 Minuten.
Zusätzlich habe ich 10 TImages und jedes davon kann 2 Zustände annehmen (2 verschiedene Grafiken).

Nun möchte ich in einem Thread eine Schleife ausführen lassen welche nach und nach von links nach rechts die Zustände der Bilder ändert, und das in 600 Sekunden.

Das mit dem Bilder-wechseln, dem Thread usw klappt alles aber ich bin wohl zu dumm diese 600 Sekunden in Millisekunden umzuwandeln, SODASS
ich eine eigene Schleife mit Sleep(1) verwenden kann statt Sleep(die-ausgerechnete-zeit).
Das soll den Vorteil haben, dass sich das Programm sofort beenden lässt und nicht erst in einer Sleep(1000) oder so festhängt.

Versteht ihr mein Problem?

Ich dachte eigentlich es ginge so:
Delphi-Quellcode:
   dTmp := StrToIntDef(Edit1.Text, 600); // Single
   iMaxImgLifetime := Round(dTmp * 100); // Integer
   iMaxImgLifetime := iMaxImgLifetime * 2; // *2 weil jedes der 10 Bilder 2 Zustände haben kann (Voll und Halb)
Meine Sleep-Schleife sieht echt mies aus (die wird in jedem Schleifendurchgang im Thread aufgerufen):
Delphi-Quellcode:
 procedure doSleep(iSleep: Integer);
  var
   i: Integer;
  begin
   i := 0;
   while i < iSleep do
    begin
     Inc(i);
     Sleep(1);
    end;
  end;

Bernhard Geyer 11. Mär 2017 10:28

AW: Sekunden in Millisekunden für Sleep umwandeln
 
Threads und Aktionen auf einen Formular ist eine ganz schlechte Idee.
Die VCL (bzw. die dahinterliegenden Windows-Controls/Handles) sind dürfen nur im Erzeugenden Thread verwendet werden.
Das es gerade bei dir funktioniert ist Zufall.

Zu deiner eigentlichen Frage 1 Sekunde = 1000 Millisekunden. Siehe auch Vorsätze für Maßeinheiten

a.def 11. Mär 2017 10:34

AW: Sekunden in Millisekunden für Sleep umwandeln
 
Zitat:

Zu deiner eigentlichen Frage 1 Sekunde = 1000 Millisekunden
Das weiß ich doch aber das ist gar nicht mein Problem :P

Zitat:

Threads und Aktionen auf einen Formular ist eine ganz schlechte Idee.
Dann benutze ich eben Synchronize :P

Der schöne Günther 11. Mär 2017 10:44

AW: Sekunden in Millisekunden für Sleep umwandeln
 
Deine Annahme dass ein Sleep(1) auch wirklich eine Millisekunde wartet ist falsch. Schau mal in die Windows-Doku zu Sleep: https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Zitat:

The system clock "ticks" at a constant rate. If dwMilliseconds is less than the resolution of the system clock, the thread may sleep for less than the specified length of time. If dwMilliseconds is greater than one tick but less than two, the wait can be anywhere between one and two ticks, and so on.

Zitat:

Zitat von a.def (Beitrag 1363800)
Das soll den Vorteil haben, dass sich das Programm sofort beenden lässt und nicht erst in einer Sleep(1000) oder so festhängt.

Falls das deine Motivation ist dann ist Sleep nicht das richtige. Ich würde das mit WaitForSingleObject machen - Das ist im Endeffekt wie ein Sleep, aber wenn z.B. den Thread von außen terminieren möchte kann man es "abbrechen". Gibt im Forum bestimmt ein Beispiel. Wenn nicht, sag Bescheid.

a.def 11. Mär 2017 10:52

AW: Sekunden in Millisekunden für Sleep umwandeln
 
Ok nochmal anders...

ich möchte statt Sleep(10000), welches den Thread für 10 Minuten blockieren würde, eine eigene Prozedur schreiben dir X-Mal Sleep(1) aufruft, sodass man am Ende auf circa 10000 kommt.
Und die Konvertierung von der Eingabe "600" (Sekunden) in Verbindung mit den 10 Bildern die jeweils 2 Zustände haben können schaffe ich nicht.

t.roller 11. Mär 2017 11:06

AW: Sekunden in Millisekunden für Sleep umwandeln
 
Siehe hier:
http://www.delphipraxis.net/1362573-post17.html

a.def 11. Mär 2017 11:21

AW: Sekunden in Millisekunden für Sleep umwandeln
 
Genau das ist es was ich gesucht habe nur ich war zu dumm dafür das selber zu machen. :thumb:

Mavarik 11. Mär 2017 11:57

AW: Sekunden in Millisekunden für Sleep umwandeln
 
Wenn Du die einen TEvent erzeugst...

Wait := TEvent.create(NIL,true,true,'');

Du kannst bei einem Wait.WaitFor(TimeOut) angeben wie lange ein Thread warten soll..
Bei einem Keypress oder was auch immer du machst um Dein Programm zu beenden, brauchst Du nur ein Wait.SetEvent; Terminate; aufrufen und schon ist dein Thread beenden.

Mavarik

a.def 11. Mär 2017 13:20

AW: Sekunden in Millisekunden für Sleep umwandeln
 
Bzgl dieses Codes hier:

Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject);
var
AlarmTimer : THandle;
Zeit : Large_Integer;
start, ende : Cardinal;
begin
  Memo1.lines.add('SetWaitableTimer: 1 sec Running');
  start:= GetTickCount;
AlarmTimer := CreateWaitableTimer(nil, False, nil);
CancelWaitableTimer(AlarmTimer); // goto Start
Zeit.QuadPart := 1 * (-10000000); // 1 Sekunde
SetWaitableTimer(AlarmTimer, Zeit.Quadpart, 0, nil, nil, False);
while WaitForSingleObject(AlarmTimer, 20) <> Wait_Object_0 do // Beispiel: 20msec
begin Application.ProcessMessages; end;
  end1:= GetTickCount;
  Memo1.lines.add(INTTOSTR(end1-start)+' msec');
  Memo1.lines.add('WaitableTimer: Ready');
end;
Wie lasse ich den Sleep denn 500ms warten?
Verstehe den irgendwie nicht so richtig.

Der folgende wäre mir deutlich lieber aber auf meine boolsche Prüfung reagiert er gar nicht! Caption := 'X'; wird auch nie ausgeführt wenn das drin steht.
Delphi-Quellcode:
procedure TForm1.LongDelay(Milliseconds: Integer);
var
 Tick: DWord;
 Event: THandle;
begin
 Event := CreateEvent(nil, False, False, nil);

 try
  Tick := GetTickCount + DWord(Milliseconds);

  while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
   begin
    if not bTimerRunning then
     Exit;

    Milliseconds := Tick - GetTickCount;
   end;
 finally
  CloseHandle(Event);
 end;
end;

Mavarik 11. Mär 2017 13:34

AW: Sekunden in Millisekunden für Sleep umwandeln
 
Zitat:

Zitat von a.def (Beitrag 1363824)
Der folgende wäre mir deutlich lieber aber auf meine boolsche Prüfung reagiert er gar nicht! Caption := 'X'; wird auch nie ausgeführt wenn das drin steht.
Delphi-Quellcode:
procedure TForm1.LongDelay(Milliseconds: Integer);
var
 Tick: DWord;
 Event: THandle;
begin
 Event := CreateEvent(nil, False, False, nil);

 try
  Tick := GetTickCount + DWord(Milliseconds);

  while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
   begin
    if not bTimerRunning then
     Exit;

    Milliseconds := Tick - GetTickCount;
   end;
 finally
  CloseHandle(Event);
 end;
end;

Caption := 'X'; ?? wo?

Du musst das ganz natürlich in einem Thread machen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:10 Uhr.
Seite 1 von 4  1 23     Letzte »    

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