Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Service programmieren, wie? Was beachten? (https://www.delphipraxis.net/100684-service-programmieren-wie-beachten.html)

guidok 2. Okt 2007 14:11


Service programmieren, wie? Was beachten?
 
Hallo zusammen,

bevor ich mich nun in eine Arbeit stürze und dann feststellen muss, dass die Mühe für die Katz war, würde ich gerne einige Anregungen von euch versierten Programmierern einholen.

Was ich tun will:

Die Software soll (über eine Treiber-DLL) auf eine S7-Steuerung zugreifen und gewisse Datenbereiche auslesen. Diese gelesenen Daten sollen in eine Datenbank geschrieben werden (vermutlich MySQL oder MSSQL), die derzeit lokal auf dem selben Rechner wie die Software installiert läuft.

Als letzte Aufgabe möchte ich in einer letzten Ausbaustufe noch einen Standalone Webserver (Indy HTTPServer) zur Verfügung stellen, um die Daten über Explorer abrufen zu können.

Warum als Service:

Da die Daten auch erfasst werden sollen, wenn sich noch niemand an den PC angemeldet hat, sehe ich in einer Serviceanwendung die Möglichkeit, so etwas zu realisieren. Läuft der SQL-Server eigentlich auch als Service, fällt mir gerade ein?

Die Funktionalitäten bekomme ich auf jeden Fall so hin, wie oben beschrieben, aber einen Service habe ich noch nie programmiert und keine Ahnung, auf was ich dabei achten muss, bei Programmdesign. z.B. gibt es zu libnodave (S7 Kommunikation) eine Delphi-Komponente, aber kann ich in einem Service alle möglichen Klassen frei verwenden oder gibt es da Einschränkungen? Ebenso sieht es mit der DB aus, da wollte ich auf ADO zurückgreifen, damit habe ich schon erfolgreich gearbeitet.

Ich bitte um Tips, Danke!

divBy0 2. Okt 2007 14:21

Re: Service programmieren, wie? Was beachten?
 
Hallo!

Also, soweit ich das weiß läuft MySQL als Service. Mit LibNoDave funktioniert die S7-Kommunikation ja echt perfekt, aber das weißt du sicher selbst.

Bin auch mal auf Antworten gespannt, ich wollte meine Software auch als Service weiterentwickeln...

guidok 2. Okt 2007 14:38

Re: Service programmieren, wie? Was beachten?
 
Hast du bei libnodave die NoDaveComponent verwendet, oder greifst du direkt auf die DLL zu? Wie schon geschrieben, bin ich mir nicht sicher, ob das mit den Klassen (die von TObject abgeleitet sind) in einem Service so funktioniert.

divBy0 2. Okt 2007 14:41

Re: Service programmieren, wie? Was beachten?
 
Ich hab die NoDaveComponent benutzt, da es mal wieder schnell gehen musste. Leider hatte ich noch nicht die Zeit, mich nur mit der DLL zu beschäftigen.

guidok 3. Okt 2007 16:21

Re: Service programmieren, wie? Was beachten?
 
Ok, ich bin gerade am probieren, wie das überhaupt mit einem Service funktioniert und leider geht es schon mal nicht wie ich will.

Delphi-Quellcode:
unit uMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
  TTestservice = class(TService)
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceExecute(Sender: TService);
    procedure ServiceDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    LogFile: TStringList;
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  Testservice: TTestservice;

implementation

{$R *.DFM}

const LogFileName = 'Service_log.txt';

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Testservice.Controller(CtrlCode);
end;

function TTestservice.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TTestservice.ServiceCreate(Sender: TObject);
begin
  LogFile:=TStringList.Create;
end;

procedure TTestservice.ServiceDestroy(Sender: TObject);
begin
  LogFile.Free;
end;

procedure TTestservice.ServiceExecute(Sender: TService);
begin
  while not Terminated do
  begin
    ServiceThread.ProcessRequests(False);
    Sleep(5000);
    LogFile.Add(DateTimeToStr(Now)+' OnExecute');
    LogFile.SaveToFile(LogFileName);
  end;
end;

procedure TTestservice.ServiceStart(Sender: TService; var Started: Boolean);
begin
  LogFile.Add(DateTimeToStr(Now)+' Service gestartet');
  LogFile.SaveToFile(LogFileName);
end;

end.
Es soll eigentlich nur bei alle fünf Sekunden etwas in eine Textdatei geschrieben werden. Den Service habe ich mit "Testservice \install" gestartet und er erscheint auch im Taskmanager (also bei den Prozessen). Anscheinend wird er allerdings nach einiger Zeit wieder beendet. Warum? Und wo ist meine Datei?

Chewie 3. Okt 2007 16:40

Re: Service programmieren, wie? Was beachten?
 
Versuch doch mal [code]testservice /install[code] (also mit einem Slash anstelle des Backslashs).

guidok 3. Okt 2007 16:57

Re: Service programmieren, wie? Was beachten?
 
Heilige geistige Umnachtung :wall:

Jetzt bekomme ich die Meldung "Service erfolgreich installiert".

Ist doch schon mal was und eine Datei wurde auch erstellt.

Danke, das hier auch geholfen wird, wenn die Fehler in der enormen eigenen Dummheit liegen :roll:

guidok 15. Feb 2008 09:21

Re: Service programmieren, wie? Was beachten?
 
Ich habe noch eine Frage zu dem Thema und da der Titel des Thread prinzipiell identisch lauten würde, krame ich jetzt einfach mal meine alte Frage wieder hoch.

Ist es ein gangbarer Weg die Anwendung, die später als Service laufen soll, zunächst ganz "normal" zu programmieren und später die getesteten Funktionen in ein TService zu packen?

Ich würde in dem Fall natürlich darauf achten, das keine Ein- und Ausgaben in Fenstern abgewickelt werden. Der Service soll am Ende "nur" Textdateien auf der Festplatte erzeugen, die anschließend von anderer Software weiterverarbeitet werden.

Problem wäre es höchstens, wie ich später mit angemeldetem User eine gewisse Statusinformation von meinem Service erhalten kann. Konkret geht es ja weiterhin um das oben Beschriebene. Ich habe jetzt am Rande etwas über Sockets gelesen, denkbar?

Dankend,

Guido


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