Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Thread mit timer gestartet (https://www.delphipraxis.net/182462-thread-mit-timer-gestartet.html)

akurka 27. Okt 2014 11:01

Thread mit timer gestartet
 
Hallo
Mein Thread liest Daten von der Comport und schreibt sie in verschiedene globale Variablen.
Das funktioniert mit einer endlose Schleife im Thread.
Das ist aber sicher nicht die beste Lösung.
Ich möchte lieber, dass es periodisch alle 200mS passiert.
Wenn ich mit der Componente Timer (gestartet im Form1)
das Thread starte, funktioniert es nur so lang
Form1 aktiv ist.
Beim Wechsel in Form2 läuft der Timer nicht mehr und somit wird auch der Thread nicht gestartet.
Ja nun, wie lässt es sich machen, dass sich der Thread
alle 200mS selber startet und zwahr unabhängig davon
in welche Form x ich mich gerade befinde?
Im meinem Programm wird es vermutlich 8 verschiedene
Menüs geben => jeweils andere Forms.
Und wie lässt es sich machen das möglichst wenig Rechenzeit verbraucht wird während der Wartezeit ?
Eine endlose schleife mit sleep im thread-execute ist vermutlich nicht
die beste Lösung, oder ?

DeddyH 27. Okt 2014 11:05

AW: Thread mit timer gestartet
 
Zitat:

Zitat von akurka (Beitrag 1277493)
Das ist aber sicher nicht die beste Lösung.

Und wieso nicht? Wenn Du nicht willst, dass der Thread permanent Daten einliest, schick ihn halt eine Weile schlafen, das dürfte allemal besser als diese Timer-Lösung sein.

Bowler 27. Okt 2014 11:33

AW: Thread mit timer gestartet
 
Der Timer braucht ja ein Window-Handle mit dem er dann läuft. Deswegen scheidet die Möglichkeit schonmal aus, einen Timer im Thread zu erstellen.
Ich habe das in einem Projekt bei mir genauso gemacht. In einer Schleife im Thread.Execute wird eine Funktion aufgerufen, die z.B. Daten einliest, und wenn die Funktion durch ist, dann rufe ich ein Sleep auf, und warte einige Zeit. Wenn das Sleep zurück kommt, dann läuft die Schleife weiter. Und damit wäre Dein Thread autark und läuft eigenständig in einer Schleife.

Irgendwie sowas:

Delphi-Quellcode:

procedure TMainThread.Execute;
begin
     FreeOnTerminate := False;
     Try
        While Not Terminated do
        Begin
             meineEinleseFunktion; // <---- Hier wird die Funktion aufgerufen, die die Daten einlesen soll
             Sleep(5000);
        End;
     Except
        On E:Exception do ; // TODO: Exception logging...
     End;
     Terminate;
end;

Blup 27. Okt 2014 12:19

AW: Thread mit timer gestartet
 
Es gibt sicher bessere Lösungen, aber ohne das Programm jetzt komplett umzustellen könnte man den Timer einfach in ein Datenmodul verschieben.
Das lässt man beim Programmstart erstellen und ist immer da, egal welche Formulare angezeigt werden.

Dejan Vu 27. Okt 2014 13:44

AW: Thread mit timer gestartet
 
Die Idee ist doch 'alle x ms Daten zu lesen'. Was spricht dann gegen das 'Sleep' in der Bearbeitungsschleife, wie von Bowler skizziert?

EWeiss 27. Okt 2014 13:57

AW: Thread mit timer gestartet
 
Dafür gibt es in der Kernel32 die API SetWaitableTimer
Diesen Timer kann man dann innerhalb Thread.Execute erstellen.
Sleep ist immer eine schlechte Idee.

gruss

Neutral General 27. Okt 2014 14:07

AW: Thread mit timer gestartet
 
Warum ist sleep eine schlechte Idee?
Wenns nicht der Hauptthread ist dann friert nichts ein und während dem sleep kann sich der Prozessor um andere Prozesse/Threads kümmern wodurch Resourcen gespart werden.

EWeiss 27. Okt 2014 14:16

AW: Thread mit timer gestartet
 
Zitat:

Zitat von Neutral General (Beitrag 1277525)
Warum ist sleep eine schlechte Idee?

Weil Sleep die letzte aller Möglichkeiten sein soll wenn man es nicht besser weis.
Ich verwende lieber meine Methode da ich dann von zeit zu zeit Einfluss nehmen kann auf den Thread, wann eine Aktion ausgeführt werden soll.
Nicht jede Form oder Aktion benötigt eine Wartezeit von 200ms.
Das bremst unterumständen das Programm aus.

PS:
Wenn innerhalb des Threads auf Funktionen der GUI (Form) zugegriffen wird friert das Programm für 200ms ein.

Aber jeder wie er will.

gruss

Dejan Vu 27. Okt 2014 14:42

AW: Thread mit timer gestartet
 
Zitat:

Zitat von EWeiss (Beitrag 1277528)
Das bremst unterumständen das Programm aus....Wenn innerhalb des Threads auf Funktionen der GUI (Form) zugegriffen wird friert das Programm für 200ms ein.

Wenn Sleep innerhalb eines Threads ausgeführt wird?? Das will mir nicht so recht einleuchten.

EWeiss 27. Okt 2014 14:49

AW: Thread mit timer gestartet
 
Zitat:

Zitat von Dejan Vu (Beitrag 1277531)
Zitat:

Zitat von EWeiss (Beitrag 1277528)
Das bremst unterumständen das Programm aus....Wenn innerhalb des Threads auf Funktionen der GUI (Form) zugegriffen wird friert das Programm für 200ms ein.

Wenn Sleep innerhalb eines Threads ausgeführt wird?? Das will mir nicht so recht einleuchten.

Hauptthread ist dieser der GUI
Dein Thread hat nichts mit dem der GUI gemein.
Jetzt versuche mal aus deinen Thread einen Label aus der GUI anzusprechen so das er alle 10ms die neue Zeit anzeigt.
Ich denke das dein Thread das Programm einfriert und der Label in dem Fall nicht aktualisiert wird.
Versuchs doch einfach.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr.
Seite 1 von 3  1 23      

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