Delphi-PRAXiS
Seite 1 von 2  1 2      

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 19: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 19:46

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

Popov 3. Jun 2015 20: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 20: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 21: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 22: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 22: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 3. Jun 2015 23: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 3. Jun 2015 23: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 00: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;


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

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