Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Projektplanung und -Management (https://www.delphipraxis.net/85-projektplanung-und-management/)
-   -   Wie kann man ein Programm im Hintergrund ablaufen lassen? (https://www.delphipraxis.net/185373-wie-kann-man-ein-programm-im-hintergrund-ablaufen-lassen.html)

Chemiker 3. Jun 2015 20:45

Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Hallo zusammen,

ein Programm soll im Hintergrund laufen und Daten von eine serielle Schnittstelle entgegennehmen. Die Daten sollen kurz geprüft und mit einem Zeitstempel versehen werden und dann zu einem Firebird-Server über ein Netzwerkverbindung geschickt werden.

Ich hatte zuerst an einer Konsolen Anwendung gedacht, aber für die serielle Schnittstelle muss ich Windows-Botschaften auswerten können was in einem Konsolen-Anwendung nicht geht.

Hat jemand von euch eine Idee wie man sowas am Sinnvollsten umsetzt?

Bis bald Chemiker

Perlsau 3. Jun 2015 20:46

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Mit einem Service, auch bekannt als Dienst?

Popov 3. Jun 2015 21:11

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Also das mit dem Dienst ist eine gute Idee, ich für mein Teil habe seit paar Wochen ein Programm die ganze Zeit laufen der bestimmte Informationen sammelt und speichert. Eigentlich so ähnlich wie bei dir, nur das ich es in einer normalen Logdatei speichere. Beim PC-Start wird auch das Programm gestartet, man sieht es nur im Taskmanager, es erledigt seinen Job und beendet sich beim herunterfahren.

himitsu 3. Jun 2015 21:48

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Man kann natürlich auch ein VCL-Programm ohne oder mit unsichtbarem Fenster laufen lassen (Ersteres ist nur ein bissl "gehackt"),
aber die Dienste/Services werden nicht umsonst öfters auch mal "Hintergrunddienst" genannt, weil sie halt im Hintergrund laufen. :stupid:

Luckie 3. Jun 2015 22:59

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Nur ein Dienst wird keine Windows Fensternachrichten empfangen können. Fensternachrichten sind an einen Desktop gebunden. Und ein Dienst läuft in einer anderen WindowsStation.

Perlsau 3. Jun 2015 23:04

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Wenn ich das richtig verstanden hatte, gehören Fensternachrichten doch gar nicht zu den Anforderungen des TE:

"... im Hintergrund laufen und Daten von eine serielle Schnittstelle entgegennehmen. Die Daten sollen kurz geprüft und mit einem Zeitstempel versehen werden und dann zu einem Firebird-Server über ein Netzwerkverbindung geschickt ..."

Oder braucht man für den Empfang von Daten einer seriellen Schnittstelle Fensternachrichten?

Luckie 3. Jun 2015 23:12

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Zweiter Absatz:
Zitat:

aber für die serielle Schnittstelle muss ich Windows-Botschaften auswerten können

himitsu 4. Jun 2015 00:01

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Vermutlich innerhalb des Programms, da die Komponente wohl mit Messages arbeitet,
und eigene Nachrichten kann auch ein Service empfangen/verarbeiten.

Seine Konsolenanwendung hatte halt keine Messages verarbeitet, bzw. er hatte vergessen es da einzubauen. :stupid:

Luckie 4. Jun 2015 00:11

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Zitat:

Zitat von himitsu (Beitrag 1304116)
und eigene Nachrichten kann auch ein Service empfangen/verarbeiten.

Da wäre ich jetzt interessiert wie das geht.

himitsu 4. Jun 2015 01:32

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Also das mit der Konsolenanwendung sollte unser NonVCL-Experte aber doch selber wissen. :zwinker:

OK, einfaches Beispiel: Leg einen TTimer auf dein TService-Modul und erlebe, wie es seine WM_TIMER-Message verarbeitet.


Im Internen verwendet TService die Unit Vcl.Forms und dessen Messagebehandlung.
Im Hauptthread kann man daher auch Problemlos diese Unit einbinden und Vcl.Forms.Application.ProgressMessages benutzen.
Nicht über Vcl.SvcMgr.Application, aber wie man sieht, ist TService auch aus der VCL, obwohl ein Service ja "grundsätzlich" nicht visuell sein sollte. :stupid:

Und hier die Message-Loop aus TServiceApplication.Run (Application.Run der Service-DPR):
Delphi-Quellcode:
while not Vcl.Forms.Application.Terminated do
try
  Vcl.Forms.Application.HandleMessage;
except
  on E: Exception do
    DoHandleException(E);
end;

Luckie 4. Jun 2015 01:35

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Ja. Ok. Aber bekommst du auch die Nachrichten vom Desktop der Benutzer WindwsStation in die WindowsStation des Dienstes geschickt? Weil meines Wissens nach sind Fensternachrichten an den Desktop gebunden, weil Fenster Handles auch desktopspezifisch sind.

himitsu 4. Jun 2015 01:40

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Das nicht.

Genauso wie eine Admin-Anwendung erstmal keine Messages von normalen Anwendungen bekommt, auch wenn man das irendwie freischalten konnte ... vielleicht geht das dort ja auch, wenn die Anwendung oftmals im System-Account läuft,
aber es gibt auch noch enügend andere IPC-Methoden.

Aber wenn es wirklich um eine Komponente ala TComport geht, welche regen Gebrauch von Messages und den Aufruf von Application.ProcessMessages, an den grauenhaftesten Stellen,
dann kommen die Messages ja von innen.

Luckie 4. Jun 2015 01:46

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Zitat:

Zitat von himitsu (Beitrag 1304122)
Das nicht.

Darauf wollte ich hinaus. Wenn die Komponte natürlich in einem Dienst funktioniert, dann geht es natürlich.

Chemiker 4. Jun 2015 10:50

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Hallo,

als Komponente für die Kommunikation mit der serielle Schnittstelle setzte ich TMS Async ein und für den Zugriff auf den Firebird Server entweder FIBPLUS oder IBDAC.

Zitat:

Seine Konsolenanwendung hatte halt keine Messages verarbeitet, bzw. er hatte vergessen es da einzubauen.

Dass man mit der TMS Async Komponente nicht in einer Konsolen-Anwendung arbeiten kann, hatte ich im TMS - Forum gelesen.
Dort schrieb der Support:

Zitat:

Sorry, it is currently not supported to use TVaComm from a console application. Please note also that in Windows, for serial communications, Windows sends window notification messages and handling these from console applications is technically not possible."
Bis bald Chemiker

himitsu 4. Jun 2015 12:37

AW: Wie kann man ein Programm im Hintergrund ablaufen lassen?
 
Ja, es liegt halt daran, daß Konsolenanwendungen von sich aus keine Messages verarbeiten. In der VCL ist dafür eine Behandlung eingebaut,
welches man in der Konsole auch machen kann und dann dort selber regelmäßig die Messages verarbeiten muß. Halt wie mit Application.ProcessMessages in hängenden Arbeitsschritten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 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 by Thomas Breitkreuz