Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Informationsauswertung im Hintergrund (https://www.delphipraxis.net/173018-informationsauswertung-im-hintergrund.html)

haderlump 3. Feb 2013 03:12

Informationsauswertung im Hintergrund
 
Ich bin gerade dabei eine Modellbahnsteuerung zu schreiben.
Per COMPort teilen mir verschiedene Kontakte in der Anlage mit, z.B wo sich die Züge gerade befinden.

Aber ich verwende ein paar Modale Formulare. Diese blockieren ja den Rest vom Programm.
Die Infos gehen zwar in den Empfangspuffer. Trotzdem sollten die Kontagtinformationen doch Echtzeitnah verarbeitet werden.

Reicht es, wenn ich einen Timer einsetze, nach dessen Ablauf die Infos aus dem COMPort ausgewertet werden, Oder Ist der Timer auch durch das modale Formular bockiert?

Oder wäre Multithreading hier die bessere Lösung ? Hab ich allerdings noch nie gemacht.

Irgendwie sollte das Ganze im Hintergrund weiterlaufen.

Gruß Fritz

Furtbichler 3. Feb 2013 09:19

AW: Informationsauswertung im Hintergrund
 
Das geht nur mit Threads. Lass Dir hier im Forum helfen, d.h. lies dich ein wenig ein (Grundkurs Threads), versuche selbst, dein Problem zu lösen und wenn Du nicht mehr weiter weißt, ist das Forum für dich da.

dummzeuch 3. Feb 2013 09:30

AW: Informationsauswertung im Hintergrund
 
Zitat:

Zitat von haderlump (Beitrag 1201855)
Ich bin gerade dabei eine Modellbahnsteuerung zu schreiben.

Reicht es, wenn ich einen Timer einsetze, nach dessen Ablauf die Infos aus dem COMPort ausgewertet werden, Oder Ist der Timer auch durch das modale Formular bockiert?

Oder wäre Multithreading hier die bessere Lösung ? Hab ich allerdings noch nie gemacht.

Irgendwie sollte das Ganze im Hintergrund weiterlaufen.

Ein Timer funktioniert so, dass in den festgelegten Abstaenden von Windows Messages an das Programm geschickt werden. Das funktioniert immer, allerdings haengt es vom Programm ab, ob es darauf reagiert. Ein modaler Dialog ist kein Hinderniss, aber lange laufende Aktionen, z.B. das Lesen von grossen Dateien koennen schon dafuer sorgen, dass diese Messages verloren gehen oder verspaetet abgearbeitet werden.

Im Gegensatz dazu funktioniert ein Hintergrundthread immer, egal was der Hauptthread gerade macht, solange der Rechner nicht voellig ueberlastet ist. Der Nachteil ist allerdings, dass die VCL nicht threadsafe ist, man also vom Hintergrundthread nicht auf die GUI zugreifen darf. Ausserdem muss man sich Gedanken darum machen, welcher Thread wann auf interne Datenstrukturen zugreifen darf und das ggf. synchronisieren.

Fuer Dein aktuelles Problem duerfte ein Timer ausreichen, aber wenn Du es wirklich ernst meinst mit Deinem Projekt und der Verarbeitung im Hintergrund, solltest Du Dich so frueh wie moeglich mit Multithreading beschaeftigen. Je laenger du wartest, desto schwieriger wird es sein, Dein Programm umzustellen.

Irgendwas in einen Hintergrundthread laufen zu lassen ist einfach, schierig ist die Komplexitaet des Programmes zu beherrschen / debuggen, wenn vieles parallel ablaeuft. Multithreading ist nicht einfach. Es gibt allerdings diverse Bibliotheken, z.B. die OmniThreadLibrary, die einen dabei unterstuetzen.

twm

haderlump 3. Feb 2013 10:08

AW: Informationsauswertung im Hintergrund
 
Danke für eure Antworten
Ja, sehr viel hätte der Thread ja nicht zu tun, im Schnitt kommen alle paar Sekunden mal jeweils 2 Bytes an. Der Empfängerpuffer schafft das locker.
Meine Hauptfrage war ja, ob der Timer weiterläuft während ein modales Feld geöffnet ist.
Ich möchte ergänzend noch bemerken, dass ich schon viel mit Microcontrollern gearbeitet habe, und da sind timergesteuertebe Interrupts gang und gäbe.

Beim Multithreading wird ja so was weiß ich alle 20 mS der Thread gewechselt.
Doch wie läuft das eigentlich beim Debugging ab ?
Schaltet der Debugger auch alle 20 mS um, oder nach so vielen Takten wie 20 mS in Echtzeit benötigen ?

Die Nächste Frage: Ich habe gelesen, dass Delphi eine TThread-Komponente hat. Bei Lazarus habe ich die aber nicht gefunden, oder vielleicht heißt die da auch anders. Geht das auch ohne diese Komponente, oder wo bekommt man eine her.

Gruß Fritz

Sir Rufo 3. Feb 2013 10:26

AW: Informationsauswertung im Hintergrund
 
Delphi-Referenz durchsuchenTThread ist keine Komponente sondern eine Klasse und die kapselt auch nur den Zugriff auf die Funktionalität des Betriebssystems.

Ob es eine analoge Klasse bei FreePascal (Lazarus ist eine IDE) gibt kann ich nur googlen.
http://www.freepascal.org/docs-html/...s/tthread.html

haderlump 3. Feb 2013 17:04

AW: Informationsauswertung im Hintergrund
 
Danke für die Antworten.
Ich probiere es mal mit dem Timer.
Es müssen immer nur wenige Bytes abgeholt und verarbeitet werden, und die Verareitungsroutine ist auch nicht sehr umfangreich.
Der Zugriff auf den Hauptdatenbereich ist quasi exklusiv. Das heißt nicht formal, aber de Fakto werden die entsprechenden Daten nur von der beschriebenen Routine verändert.

Man muss sich das so vorstellen:
Es gibt quasi eine "Hauptdatenbank" , eine mehrfach verkettete (oder besser vermaschte) Liste die die Modellbahnanlage abbildet. An verschiedenen Elementen werden dann noch Datensätze per 1:n Verknüpfung angehängt.
so z.B Achszählkonten: Dabei ist bei jedem Gleisanfang bzw -ende ein Kontakt, der von den Achsen des Zuges betätigt wird. fährt der Zug in den Abschnitt, wird das Konto erhöht, beim Verlassen wird es erniedrigt. Ist das Konto wieder auf Null, ist der Abschnitt wieder leer. Es werden dabei wenig Resourcen verbraucht, da das "Event" Kontaktbetätigung relativ selten passiert. Oft eine halbe Minute lang gar nix, dann kommen wieder mal ein paar Bytes, usw. Insgesammt eine stressarme Angelegenheit. Die Konten werden ausser bei einem Korrektureingriff nur von den Kontakten verändert, und der Korrektureingriff (Achszählgrundstellung im Störungsfall) wird praktisch nur an Gleisen angewendet, wo kein Zugverkehr stattfindet.
Die Kontenstände selbst werden vom Hauptprogramm nur abgefragt.

Mir ging es nur darum, dass ein Modales Formular den Timer nicht blockiert.

Gruß Fritz

haderlump 5. Feb 2013 04:41

AW: Informationsauswertung im Hintergrund
 
Hallo zusammen

So, nun bin ich schon wieder etwas schlauer.
Der Timer eröffnet selbst einen eigenen Thread, und damit ist das Problem gelöst.

Again what learned !!:idea:

Gruß Fritz

Sir Rufo 5. Feb 2013 07:19

AW: Informationsauswertung im Hintergrund
 
Der normale Delphi-Referenz durchsuchenTTimer startet keinen eigenen Thread

http://www.delphipraxis.net/81091-ti...er-thread.html

aber er wird auch durch ein modale Form nicht angehalten ;)

Eine modale Form setzt alle anderen Forms auf disabled bzw.
Delphi-Quellcode:
Enabled := False
und damit reagieren diese Forms auf keine Benutzereingaben mehr ;)

haderlump 5. Feb 2013 17:22

AW: Informationsauswertung im Hintergrund
 
Gut, so genau weiß ich das auch nicht.
Bin also so daraufgekommen:

http://www.abload.de/img/5squr5.jpg
Danach kam dann dieses Fenster
http://www.abload.de/img/6eau39.jpg

Und da wird dieser Timer als eigener Thread ausgewiesen.

Na ja, wie auch immer, es funktioniert gut !

Gruß Fritz

Sir Rufo 5. Feb 2013 17:31

AW: Informationsauswertung im Hintergrund
 
Joar der MainThread wo auch die VCL drin läuft ist halt auch ein Thread ;)


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