Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Statusabfragen ständig ausführen? (https://www.delphipraxis.net/23453-statusabfragen-staendig-ausfuehren.html)

BKempf 4. Jun 2004 23:54

Re: Statusabfragen ständig ausführen?
 
Ich hatte neulich ein aehnliches Problem, das ich mit

Delphi-Quellcode:
repeat
  Application.ProcessMessages;
until Terminated or ButtonGeklickt;
geloest hatte. Das Ganze lief in einem Thread (daher die Abfrage auf Terminated) und sollte auf einen Button warten.
Das Ganze funktionierte zwar zunaechst, stellte sich an anderer Stelle jedoch als unausgegorener Hack heraus (u.a. 100% CPU-Auslastung) und stattdessen wird die Variable jetzt in regelmaessigen Abstaenden mit einem Timer abgefragt :-)

Ich denke, ein Timer ist auch bei deinem Problem angebracht. Der koennte dann sowas testen wie (ungetestet):

Delphi-Quellcode:
if Thread.Terminated then
begin
  if Assigned(Thread.FatalException) then
    Protokoll('Thread ist gestorben');
end;
Alternativ gibt es auch das OnTerminate-Ereignis, das du dafuer einspannen koenntest.

Luckie 5. Jun 2004 12:57

Re: Statusabfragen ständig ausführen?
 
Zitat:

Zitat von BKempf
Delphi-Quellcode:
repeat
  Application.ProcessMessages;
until Terminated or ButtonGeklickt;

Wenn das ganze schon in einem separaten Thread läuft, warum dann Application.ProcessMessages? :gruebel:

Chewie 5. Jun 2004 13:32

Re: Statusabfragen ständig ausführen?
 
Und sinnvoller wäre es, den Thread bei dem ButtonKlick zu beenden als im Thread den Status einer globalen Variable abzufragen.

BKempf 6. Jun 2004 14:38

Re: Statusabfragen ständig ausführen?
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von BKempf
Delphi-Quellcode:
repeat
  Application.ProcessMessages;
until Terminated or ButtonGeklickt;

Wenn das ganze schon in einem separaten Thread läuft, warum dann Application.ProcessMessages? :gruebel:

Andere Threads (und sogar der entsprechende Thread selbst) könnten, auch während einer auf einen Buttonklick wartet, Daten über die serielle Schnittstelle empfangen. Die Anweisung sorgt dafür, daß die entsprechenden Events nicht verlorengehen bzw. ewig verzögert werden.
Das Programm muss mehr oder weniger in Echtzeit (spätestens alle paar Sekunden) Daten empfangen und auswerten.

Luckie 6. Jun 2004 14:43

Re: Statusabfragen ständig ausführen?
 
Was hat der separate Thread mit anderen Thread zu tun, die auf Ereignisse warten? Desweiteren bin ich mir gar nicht so sicher, ob Application.Processmessages in einem nicht Hauptthread überhauot etwas bewirkt. Das setzt ja vorraus, dass der Thread eine Messageloop besitzt.

BKempf 6. Jun 2004 18:46

Re: Statusabfragen ständig ausführen?
 
Zitat:

Zitat von Luckie
Was hat der separate Thread mit anderen Thread zu tun, die auf Ereignisse warten? Desweiteren bin ich mir gar nicht so sicher, ob Application.Processmessages in einem nicht Hauptthread überhauot etwas bewirkt. Das setzt ja vorraus, dass der Thread eine Messageloop besitzt.

Ich hatte das auch ohne Application.ProcessMessages ausprobiert, aber dabei hagelte es dann Timeouts; sobald der Button dann gedrueckt wurde, wurde das angeschlossene Geraet mit den gesammelten Anfragen aus der Wartezeit ueberschwemmt und verschluckte sich daran.
Getestet hatte ich das nur mit einem Geraet, aber mit mehreren waer das dann ja eh schiefgegangen.
Aber wie gesagt, ist inzwischen eh anders geloest :-)

feiadragon 7. Jun 2004 09:57

Re: Statusabfragen ständig ausführen?
 
HI Leute,

habs jetzt so gemacht wie es Luckie am Anfang mal angedeutet hatte:
Im Thread setze ich einfach die Caption eines Labels auf 'Thread läuft'...
Primitiv aber geht...

DAs mit den Timern werd ich auch mal ausprobieren.

Ganz nebenbei, hab ich jetzt schon häufiger gehört, was bringt das application.processmessages????

Thx, feiadragon

Stevie 7. Jun 2004 10:13

Re: Statusabfragen ständig ausführen?
 
Zitat:

Zitat von Delphi-Hilfe
Mit der Methode ProcessMessages können Sie eine Anwendung unterbrechen, so daß die Ereigniswarteschlange verarbeitet werden kann.

procedure ProcessMessages;

Beschreibung

Durch einen Aufruf von ProcessMessages ermöglichen Sie der Anwendung, die Ereignisse in der Warteschlange abzuarbeiten.

Hinweis

ProcessMessages ermöglicht nicht, daß die Anwendung in den Leerlauf übergeht. Hier liegt ein Unterschied zu HandleMessage.

Das wird zum Beispiel gemacht, wenn etwas rechenintensives durchgeführt wurde aber die Anwendung weiter auf Benutzereingaben reagieren soll.

feiadragon 7. Jun 2004 10:44

Re: Statusabfragen ständig ausführen?
 
Achso,

ich dachte dafür bräuchte man nen anderen Thread, aber man lernt nie aus :-D :-D

Tyrael Y. 7. Jun 2004 10:56

Re: Statusabfragen ständig ausführen?
 
mal so nebenbei...

bei solch einem Konstrukt bringt Application.ProcessMessages ziemlich gar nix
aber folgendes sollte am Ende der Schleife immer stehen

Delphi-Quellcode:
repeat
.
.
.

Sleep(100);
until Terminated;
..durch das Sleep kreigen andere Prozesse Rechnerzeit und man verhindert einen Deadlock,
falls andere Threads wichtige Aufgaben noch zu erledigen haben

;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:18 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz