AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Sekunden in Millisekunden für Sleep umwandeln
Thema durchsuchen
Ansicht
Themen-Optionen

Sekunden in Millisekunden für Sleep umwandeln

Ein Thema von a.def · begonnen am 11. Mär 2017 · letzter Beitrag vom 12. Mär 2017
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
a.def
(Gast)

n/a Beiträge
 
#1

Sekunden in Millisekunden für Sleep umwandeln

  Alt 11. Mär 2017, 10:19
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;
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Sekunden in Millisekunden für Sleep umwandeln

  Alt 11. Mär 2017, 10:28
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#3

AW: Sekunden in Millisekunden für Sleep umwandeln

  Alt 11. Mär 2017, 10:34
Zitat:
Zu deiner eigentlichen Frage 1 Sekunde = 1000 Millisekunden
Das weiß ich doch aber das ist gar nicht mein Problem

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

Geändert von a.def (11. Mär 2017 um 10:36 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Sekunden in Millisekunden für Sleep umwandeln

  Alt 11. Mär 2017, 10:44
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.

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.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#5

AW: Sekunden in Millisekunden für Sleep umwandeln

  Alt 11. Mär 2017, 10:52
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.
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#6

AW: Sekunden in Millisekunden für Sleep umwandeln

  Alt 11. Mär 2017, 11:06
Siehe hier:
http://www.delphipraxis.net/1362573-post17.html
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#7

AW: Sekunden in Millisekunden für Sleep umwandeln

  Alt 11. Mär 2017, 11:21
Genau das ist es was ich gesucht habe nur ich war zu dumm dafür das selber zu machen.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Sekunden in Millisekunden für Sleep umwandeln

  Alt 11. Mär 2017, 11:57
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
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#9

AW: Sekunden in Millisekunden für Sleep umwandeln

  Alt 11. Mär 2017, 13:20
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;

Geändert von a.def (11. Mär 2017 um 13:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Sekunden in Millisekunden für Sleep umwandeln

  Alt 11. Mär 2017, 13:34
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...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 17:13 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