AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Informationsauswertung im Hintergrund
Thema durchsuchen
Ansicht
Themen-Optionen

Informationsauswertung im Hintergrund

Ein Thema von haderlump · begonnen am 3. Feb 2013 · letzter Beitrag vom 5. Feb 2013
Antwort Antwort
haderlump

Registriert seit: 21. Jan 2013
Ort: Ingolstadt
23 Beiträge
 
FreePascal / Lazarus
 
#1

Informationsauswertung im Hintergrund

  Alt 3. Feb 2013, 03:12
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
Fritz Tremmel
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: Informationsauswertung im Hintergrund

  Alt 3. Feb 2013, 09:19
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.

Geändert von Furtbichler ( 3. Feb 2013 um 09:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.468 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Informationsauswertung im Hintergrund

  Alt 3. Feb 2013, 09:30
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
Thomas Mueller
  Mit Zitat antworten Zitat
haderlump

Registriert seit: 21. Jan 2013
Ort: Ingolstadt
23 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Informationsauswertung im Hintergrund

  Alt 3. Feb 2013, 10:08
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
Fritz Tremmel
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Informationsauswertung im Hintergrund

  Alt 3. Feb 2013, 10:26
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
haderlump

Registriert seit: 21. Jan 2013
Ort: Ingolstadt
23 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Informationsauswertung im Hintergrund

  Alt 3. Feb 2013, 17:04
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
Fritz Tremmel
  Mit Zitat antworten Zitat
haderlump

Registriert seit: 21. Jan 2013
Ort: Ingolstadt
23 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Informationsauswertung im Hintergrund

  Alt 5. Feb 2013, 04:41
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 !!

Gruß Fritz
Fritz Tremmel
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Informationsauswertung im Hintergrund

  Alt 5. Feb 2013, 07:19
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. Enabled := False und damit reagieren diese Forms auf keine Benutzereingaben mehr
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 5. Feb 2013 um 07:24 Uhr)
  Mit Zitat antworten Zitat
haderlump

Registriert seit: 21. Jan 2013
Ort: Ingolstadt
23 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Informationsauswertung im Hintergrund

  Alt 5. Feb 2013, 17:22
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
Fritz Tremmel
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Informationsauswertung im Hintergrund

  Alt 5. Feb 2013, 17:31
Joar der MainThread wo auch die VCL drin läuft ist halt auch ein Thread
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 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