Autor Beitrag
kerstel
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 08.02.15 17:51 
Hallo,

ich möchte einen Service entwickeln der zu einem bestimmten Zeitpunkt Artikeldaten von einem FTP holt und verarbeitet. Ich bin auf folgende Fragen gestoßen:
:: Wie kann ich sagen, dass der Service immer um 23:56 eine bestimmte Funktion ausführt?
:: Wie kann ich einen Prozess von einem externen Programm aus ansteuern? Als Bsp. der Artikelimport läuft immer um 23:56, aus irgend einem Grund müsste er aber jetzt laufen. zb. eine Datei in ein Verzeichnis legen und der Dienst prüft sekündlich ob diese da ist? Ist das so sinnvoll?
:: Wie kann ich den Dienst testen, ohne ihn installieren zu müssen?

Danke für die Hilfe

LG
Ralf
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 08.02.15 18:11 
Zitat:
:: Wie kann ich sagen, dass der Service immer um 23:56 eine bestimmte Funktion ausführt?

Dein Service muss irgendwas tun sonst beendet der sich automatisch. Er könnte zum Beispiel regelmäßig die Uhrzeit prüfen und bei Zeiten dann irgendeine Funktion ausführen.
Zitat:
Wie kann ich einen Prozess von einem externen Programm aus ansteuern? Als Bsp. der Artikelimport läuft immer um 23:56, aus irgend einem Grund müsste er aber jetzt laufen. zb. eine Datei in ein Verzeichnis legen und der Dienst prüft sekündlich ob diese da ist? Ist das so sinnvoll?

In dem du ihm ein Interface gibst über das es von jemand anderem angesprochen werden kann. Es gibt da Dutzende von Techniken die man benutzen kann. Alle unter dem Stickwort IPC (Inter Process Communication) zu finden.
Zitat:
:: Wie kann ich den Dienst testen, ohne ihn installieren zu müssen?

Es steht in der Doku wie man einen Dienst schreibt. Ein Dienst hat eine Main Methode wie jedes andere Programm auch. Also in der Main einfach einen Kommandozeilenparameter abfragen und entweder so starten wie bei jedem Executable oder eben denn üblichen Service Startcode ausführen.

Warum soll das ein Dienst sein? Ein Dienst ist was was ständig im Hintergrund laufen soll. Etwas das einmal am Tag bzw. ganz oder manuell laufen soll würde ich eher als simple Consolenanwendung auslegen und für das regelmäßige ausführen einfach im Windows Taskscheduler einen entsprechenden Ausführungsplan anlegen.
kerstel Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 08.02.15 18:23 
Hi,

da werden noch andere sachen rein laufen, weshalb das zu einem Dienst führt :)

Was bedeutet "er muss irgendwas tun"? Wie stellt sich das dar?

LG
Ralf
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Di 24.02.15 10:26 
user profile iconkerstel hat folgendes geschrieben Zum zitierten Posting springen:

Was bedeutet "er muss irgendwas tun"? Wie stellt sich das dar?


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TDienst.ServiceExecute(Sender: TService);
begin
  while not Terminated do
  begin
    ServiceThread.ProcessRequests(False);
  end;
end;


Ein Programm läuft bis es Beendet wurde.
Ein Dienst läuft solange er was zu tun hat.

Du musst also nur "verhindern" das er das Beenden erreicht.

Sobald ServiceExecute beendet ist, beendet sich auch der Dienst

_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Di 24.02.15 10:29 
user profile iconkerstel hat folgendes geschrieben Zum zitierten Posting springen:
:: Wie kann ich sagen, dass der Service immer um 23:56 eine bestimmte Funktion ausführt?


Ich habe einen Timer in einem DataModul der die Zeit prüft und zur gegebenen Zeit etwas tut.

Ein Problem das ich aber damit nicht lösen konnte ist, dass der Dienst damit immer prüft ob er was tun darf und damit hält er die Serverauslastung auf schwachen PC's / Servern hoch :(

_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Di 24.02.15 10:30 
user profile iconkerstel hat folgendes geschrieben Zum zitierten Posting springen:

:: Wie kann ich einen Prozess von einem externen Programm aus ansteuern? Als Bsp. der Artikelimport läuft immer um 23:56, aus irgend einem Grund müsste er aber jetzt laufen. zb. eine Datei in ein Verzeichnis legen und der Dienst prüft sekündlich ob diese da ist? Ist das so sinnvoll?


Auch das Problem kann mit einem DataModul gelöst werden, indem man eine Anwendung schreibt und dort auch manuelles Anstossen ermöglicht

_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Di 24.02.15 10:31 
user profile iconkerstel hat folgendes geschrieben Zum zitierten Posting springen:

:: Wie kann ich den Dienst testen, ohne ihn installieren zu müssen?


Ich konnte bisher keinen Dienst testen ohne ihn zu installieren, da der Dienst im Hintergrund läuft.

_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 24.02.15 10:33 
Es geht um C# .Net nicht Delphi.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Di 24.02.15 13:14 
user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Ein Problem das ich aber damit nicht lösen konnte ist, dass der Dienst damit immer prüft ob er was tun darf und damit hält er die Serverauslastung auf schwachen PC's / Servern hoch :(

Du kannst dem Scheduler von Windows normalerweise sagen, dass du nichts zu tun hast. Wenn du weist, zu welchem Zeitpunkt du eine Aktion ausführen möchtest, z.B. um 12:00Uhr, und es ist jetzt 11:00Uhr, dann sag dem Scheduler einfach, dass du 30min nichts zu tun hast.

In Delphi sieht das so aus:
ausblenden Delphi-Quelltext
1:
  Sleep(30*60*1000)					

In C# gibts das sicher auch.
Siehe auch: en.wikipedia.org/wiki/Sleep_(system_call)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)