![]() |
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 |
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.
|
AW: Informationsauswertung im Hintergrund
Zitat:
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 ![]() twm |
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 |
AW: Informationsauswertung im Hintergrund
![]() Ob es eine analoge Klasse bei FreePascal (Lazarus ist eine IDE) gibt kann ich nur googlen. ![]() |
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 |
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 |
AW: Informationsauswertung im Hintergrund
Der normale
![]() ![]() aber er wird auch durch ein modale Form nicht angehalten ;) Eine modale Form setzt alle anderen Forms auf disabled bzw.
Delphi-Quellcode:
und damit reagieren diese Forms auf keine Benutzereingaben mehr ;)
Enabled := False
|
AW: Informationsauswertung im Hintergrund
Gut, so genau weiß ich das auch nicht.
Bin also so daraufgekommen: ![]() ![]() Danach kam dann dieses Fenster ![]() ![]() Und da wird dieser Timer als eigener Thread ausgewiesen. Na ja, wie auch immer, es funktioniert gut ! Gruß Fritz |
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 07:47 Uhr. |
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