Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Timer-Frage (https://www.delphipraxis.net/160076-timer-frage.html)

Lifthrasir 26. Apr 2011 16:32

Timer-Frage
 
Hi,

also bei verschiedenen Programmen ist mir aufgefallen, dass wenn eine sehr große oder lange Prozedure abgearbeitet wird, dass Programm scheinbar hängt oder stehen geblieben ist. Bzw. lassen sich Prozeduren nicht via eines Buttons abbrechen oder pausieren, denn ich denke mal das Program wird die 'Aufgabe' erst abarbeiten ehe eine 'Neue' gestartet wird.

Um nun aber dennoch Pause für Aktionen zu haben, oder einfach damit das Programm nicht 10 min freezed, zerlege ich diese Prozeduren nun in Häppchen und gebe sie einem Timer.

Dies ist wahrscheinlich eine recht dumme Art und Weise um das Problem zu klären, aber eine Bessere fällt mir nicht ein.
Die Frage jedoch ob es zu Systemabstürzen kommen kann bleibt. Vllt hatte ich ja nur Glück. Ich meine, wenn das Timer-Intervall auf 1, also auf 1 ms steht ehe es neu beginnt, die Timer-Prozedure aber in der Berechnung länger als 1ms dauert, hatt dies Folgen für den Rechner, Ressourcen etc? Oder wartet Timer bis es abgearbeitet wurde und startet danach die nächste Periode?

Danke für eure Antworten :)

Luckie 26. Apr 2011 17:09

AW: Timer-Frage
 
Die Lösung heißt Threads.

Lifthrasir 26. Apr 2011 17:13

AW: Timer-Frage
 
Threads - sagt mir noch nichts, muss ich mich wohl belesen :( :)


Danke für den Hinweis, werde der Sache mal nachgehen

patti 26. Apr 2011 17:45

AW: Timer-Frage
 
Zitat:

Zitat von Lifthrasir (Beitrag 1097045)
Dies ist wahrscheinlich eine recht dumme Art und Weise um das Problem zu klären, aber eine Bessere fällt mir nicht ein.

Das ist tatsächlich keine allzu gute Option ;) Angst vor Systemabstürzen musst du keine haben, aber die Lösung ist schon sehr "dirty".
Threads wären genau das richtige, allerdings benötigt man dafür schon etwas Hintergrundwissen. Eine andere Möglichkeit, damit das Programm zumindest nicht vollständig einfriert, ist folgendes: Probier mal Application.ProcessMessages aus:

Delphi-Quellcode:
for i := 0 to 100 do
begin
  Sleep(1000);
  Application.ProcessMessages;
end;
Dies veranlasst, dass alle anstehenden Messages verarbeitet werden, bevor die Schleife fortgeführt wird. So ließe sich sogar eine "Abbrechen"-Funktionalität basteln.

Übrigens: ein Timer hat nur eine Auflösung von einigen MS im zweistelligen Bereich, d.h. wenn du das Intervall auf 1 ms stellst, dann wird das Timer-Event gar nicht jede MS getriggert sondern nur alle 15 oder 20 ;)

s.h.a.r.k 26. Apr 2011 17:57

AW: Timer-Frage
 
Hey,

das Problem, welches du hast ist folgendes: dein Programm hat einen Thread (="Mainthread") und in diesem Thread läuft quasi alles ab. Windows ist, wie du vielleicht schon weiß, Nachrichten-basiert, d.h. bei einem Klick wird eine Nachricht an das Programm geschickt, welches diese dann an den Button weiterleitet. Genauso läuft das auch mit dem Neuzeichnen, Drag & Drop und sonstigen Aktionen. Diese Nachrichten werden aber erst dann abgearbeitet, wenn der Haupthread eben Zeit dafür hat. Da hat er natürlich nicht, wenn der Thread deine lange Methode abarbeitet. Daher reagiert dein Programm auch nicht mehr, jedenfalls so lange nicht mehr, bis die Methode eben beendet ist.

Das Application.ProcessMessages macht folgendes: es schaut nach, ob aktuell Nachrichten vorhanden sind, die abgearbeitet werden sollten, unterbricht quasi die aktuelle Methode und arbeitet dann eben die Nachrichten ab. Dies führt dann aber dazu, dass die eigentliche Ausführungsdauer noch etwas länger ist, da zwischendurch ja noch was anderes gemacht wird.

Daher ist es sinnvoll sich hier Threads anzuschauen, da diese wirklich parallel zum Mainthread laufen und den Mainthread nicht behindern oder blockieren -- außer man will, dass das so ist. Schau dich hier im Forum mal zum Thema um, du wirst massig Threads, auch zu deinem Problem finden.

Lifthrasir 26. Apr 2011 21:04

AW: Timer-Frage
 
Hmm..

Ja scheint dann noch etwas Arbeit auf mich zu warten..

Danke für die guten Antworten, ich denke mir wurde geholfen :)

-187- 26. Apr 2011 21:08

AW: Timer-Frage
 
Ich stand auch mal vor dem Problem. Wenn du dich für TThreads entscheidest solltest du es relativ schnell raus haben.

s.h.a.r.k 26. Apr 2011 21:26

AW: Timer-Frage
 
Zitat:

Zitat von -187- (Beitrag 1097112)
Ich stand auch mal vor dem Problem. Wenn du dich für TThreads entscheidest solltest du es relativ schnell raus haben.

Man kann aber auch in viele Probleme rein laufen ;) Auf ein richtig gutes VCL-Tutorial warte ich immer noch. Das von Luckie ist natürlich klasse, aber da wird eher der technische Aspekt behandelt. Man ist sich anfangs sehr vieler Probleme noch nicht so recht bewusst, ebenso der DO and DONTs. Aber wie schon gesagt, hier im Forum findet sich sehr viel dazu!

-187- 26. Apr 2011 23:50

AW: Timer-Frage
 
Try & Error :) Ich konnte vieles hier im Forum besprechen! Ansonsten gibt es auch viele gute englische Artikel wenn man sich via Google auf die Reise macht ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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