Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Dienst/Service oder VCL-Anwendung (https://www.delphipraxis.net/156997-dienst-service-oder-vcl-anwendung.html)

Jens Hartmann 23. Dez 2010 14:08

Dienst/Service oder VCL-Anwendung
 
Hallo zusammen,
ich habe mal eine Frage um einen Lösungsansatz zu bekommen.
Ich bemühe mich zurzeit meine Anwendung mit einem Web-Client zu erweitern. Diese werde ich vermutlich über IntraWeb machen.

Über die aktuelle VCL-Anwendung lese ich Daten von einer Com-Schnittstelle und speichere diese in einer Datenbank.
Ziel ist es jetzt, dies Datenbank über Webbrowser abzufragen.
Da die Abfrage über den Webbrowser erfolgen soll, überlege ich zurzeit die VCL Anwendung neu zu schreiben und nur noch so eine Art Com-Server zu Programmieren, der lediglich Daten lesen und speichern kann. „Keine Benutzeroberfläche“.
Jetzt wäre natürlich die Frage, macht man das am besten als normale VCL-Anwendung und legt diese in die Autostart, oder eventuell besser als Dienst.

Für beides sehe ich zurzeit Vor- und Nachteile.

Vorteil VCL-Anwendung unter allen Betriebssystemen mit einem Art Logfenster für den User sichtbar.
Nachteil VCL-Anwendung, es muss eine Windows Benutzer angemeldet werden.

Vorteil Dienst/Service, läuft auch ohne Windows Benutzeranmeldung.
Nachteil Dienst/Service, unter Windows Vista und 7 keine interaktiven Dienst mehr möglich, wodurch ich zurzeit vermutlich nur eine Log-File schreiben lassen könnt um eventuell Probleme fest zustellen.

Nachteil Dienst/Service, ich weiß nicht, ob ich die Anbindung an die Com-Schnittstelle Problemlos mit einem Dienst unter Win7 etc. programmieren kann.
Vielleicht könnt Ihr mir ja mal sagen, wir Ihr sowas machen würdet.

Gruß Jens

stahli 23. Dez 2010 14:43

AW: Dienst/Service oder VCL-Anwendung
 
Hier mein Thread zu dem Thema.
Ich habe mich dann für eine "versteckte" VCL-Anwendung entschieden.
Das war für meine Zwecke das Einfachste.

Jens Hartmann 23. Dez 2010 15:05

AW: Dienst/Service oder VCL-Anwendung
 
Hallo stahli,

diesen Thread kenne ich. Aber trotzdem Danke.

Gruß Jens

Sir Rufo 23. Dez 2010 17:32

AW: Dienst/Service oder VCL-Anwendung
 
Definitiv als Dienst, denn du hast noch ein paar Vorteile eines Dienstes vergessen:

- einfaches Beenden, Pausieren, Starten und Neustarten des Dienstes
- hängt sich der Dienst weg, so kann Windows den Dienst automatisch wieder starten

Natürlich sollte der Dienst fehlerfrei laufen, aber er kann halt auch mal Zicken und da ist ein automatisches Wiederherstellen eben komfortabler.

Log-Meldungen kann man auch per Socket-Server an die Clients übertragen. Somit wäre es auch möglich, den Log-Client auf mehreren Rechnern laufen zu lassen und jeder bekommt die Infos mitgeteilt.

Jens Hartmann 23. Dez 2010 18:20

AW: Dienst/Service oder VCL-Anwendung
 
Zitat:

Zitat von Sir Rufo
Minuten
Definitiv als Dienst, denn du hast noch ein paar Vorteile eines Dienstes vergessen:.....

Gibt es denn ein gutes deutschsprachiges Tutorial. Hier im Forum gibt es zwar hunderte Beiträge, allerdings habe ich noch nichts gefunden, was ich so richtig verstehe. Deshalb wäre halt ein deutschsprachiges Tutorial total genial.
Außerdem würde mir das wahrscheinlich helfen, die Aufgabe und Arbeitsweise eines Dienstes besser zu verstehen.

Gruß Jens

Sir Rufo 23. Dez 2010 19:52

AW: Dienst/Service oder VCL-Anwendung
 
Die beste Herangehensweise ist IMHO folgende:

Bau Dir einen/mehrere Thread/s, der/die alle gewünschten Funktionen ausführen.
Für die Entwicklung dieser Threads packst du die in ein VCL-Projekt.

Laufen die Threads dann nimmst du die Service-Vorlage und benutzt das Service-Geraffel nur als Wrapper für die Threads.
(So wie du für die Entwicklung die Form mit Buttons belegst, die die Threads steuern)

Vorteil: Du hast die gleiche Funktionalität einmal als VCL-App (mit Log-Ausgabe im Fenster) und als Service-App ;)
In einer Projekt-Gruppe kannst du auch immer beide gleichzeitig erzeugen lassen.

Ein Tut ist mir so nicht bekannt, aber ich kann mal schauen, ob ich da so eine kleine Service-Anwendung mit Doku basteln kann.
Da ist eh nix groß geheimnisvolles dran ... aber halt wie so oft im Leben, man muss es erst mal verstanden haben, was die da von einem wollen :)

Jens Hartmann 23. Dez 2010 20:01

AW: Dienst/Service oder VCL-Anwendung
 
Zitat:

Zitat von Sir Rufo
Da ist eh nix groß geheimnisvolles dran ... aber halt wie so oft im Leben, man muss es erst mal verstanden haben, was die da von einem wollen

Das ist genau mein Problem. Aber ich denke Dein vorgehen scheint mir sinnvoll. Ich finde es sogar gut, dann hätte ich den Dienst gleichzeitig als VCL-Anwendung zum testen etc.

Gute Idee, dann geh ich mal so vor.

Danke schon mal und Gruß Jens

Sir Rufo 23. Dez 2010 21:35

AW: Dienst/Service oder VCL-Anwendung
 
Ich habe hier ein Tutorial gefunden (englisch)
http://www.tolderlund.eu/delphi/service/service.htm

ele 23. Dez 2010 21:51

AW: Dienst/Service oder VCL-Anwendung
 
Ich schreibe meine Server-Anwendungen immer als Service mit Webinterface. Über das Webinterface steuert, überwacht und konfiguriert man den Service.

Die Komplette Logik ist in einer Klasse abgelegt die etwa so aussieht:

Delphi-Quellcode:
  TServiceState = (ssStopped, ssRunning, ssPaused);
  TServiceClass = class( TObject )
  protected
    FState: TServiceState;
    FIsService: Boolean;
    function GetServiceName(): String; virtual;
    function GetDisplayName(): String; virtual;
    function GetDescription(): String; virtual;
  public
    constructor Create(); virtual;
    destructor Destroy(); override;

    procedure Start(); virtual;
    procedure Stop(); virtual;
    procedure Pause(); virtual;
    procedure Resume(); virtual;
    procedure Restart(); virtual;
    procedure Execute(); virtual;

    property State: TServiceState read FState;
    property ServiceName: String read GetServiceName;
    property DisplayName: String read GetDisplayName;
    property Description: String read GetDescription;
    property IsService: Boolean read FIsService;
  end;
(In der Realität ist das ganze etwas komplizierter, ich kann aber meine Vorlage nicht einfach so open source stellen. Aber es geht hier ums Prinzip.)

Dann habe ich zwei Projekte - ein VCL Projekt und ein Service - die jeweils die Funktionen in der oben genannten Klasse aufrufen. Somit Programmiert man die Logik nur einmal, kann sie im VCL Projekt testen und debuggen und hat dann für den produktiven Betrieb einen Service.

Das macht das Entwickeln eines Services wesentlich einfacher. Allerdings muss man aufpassen, da ein Service eben nicht ganz unter den selben Bedingungen läuft wie eine übliche Windows Applikation. Das betrifft z.B. das aktuelle Verzeichnis, Window Handles (versuch mal Window Messages in einem Service zu behandeln) und z.B. darf man nicht vergessen CoInitialize() aufzurufen wenn man COM benutzen will (direkt oder indirekt). Auch läuft ein Dienst in der Regel unter dem System Benutzer, was andere Zugriffsrechte zur Folge hat. Z.B sind Netzlaufwerke die man eingerichtet hat unter dem Systembenutzer nicht zugänglich.

Jens Hartmann 25. Dez 2010 10:47

AW: Dienst/Service oder VCL-Anwendung
 
Hallo und schöne 1. Weihnachten zusammen.

Zitat:

Zitat von Sir Rufo
Ich habe hier ein Tutorial gefunden (englisch)
http://www.tolderlund.eu/delphi/service/service.htm

Danke erstmal, trotz englisch bin ich recht gut damit zurecht gekommen. Also ich denke, der Lösungsansatz "Dienst mit Threads" scheint mir am besten für mein Programm geeignet. Allerdings habe ich ein kleines Verständnisproblem. Ich habe jetzt mal meine ersten Threads geschrieben. Und auch dazu ein gutes Tutorial gelesen.
http://www.michael-puff.de/Programmi...mit_Delphi.pdf

Ich würde jetzt gerne eine VCL-Anwendung mit den entsprechenden Threads schreiben und anschließend den Dienst erstellen. Hierzu, so habe ich das zumindestens Verstanden, muss ich natürlich die gesamten Funktionen die ich benötige in die Threads auslagern. Das würde für mich bedeuten, ich müsste die Komponente CPortLib "ComPort" zur Laufzeit in dem Thread erzeugen.

Geht sowas, und wie macht man sowas. Findet man dazu was im Netz. Viel muss der Thread ja nicht machen, er muss lediglich den entsprechende ComPort erzeugen, diesen öffnen und anschließende Daten von der Com-Schnittstelle lesen. Zusätzlich müssten dies in eine Datenbank geschrieben werden. Also brauchte ich wahrscheinlich auch eine TZConnection und Query, die ich zur Laufzeit erzeuge.

Hmmm...

Oder legt man die Komponenten einfach auf die VCL-Form und in den Dienst und grieft über den Thread darauf zu. Das würde ja bedeuten, das die Kompos in der VCL-Anwendung und im Dienst den selben Namen haben müssten.

Mann ist das alles kompliziert. Ich hoffe ich konnte mein Vorhaben einigermaßen beschreiben.

Also nochmal schöne Weihnachten und Gruß Jens


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