Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Service und TTimer (https://www.delphipraxis.net/126947-service-und-ttimer.html)

Digielm 5. Jan 2009 14:20


Service und TTimer
 
Hallo Leute,

muß nochmal ganz dumm nachfragen

innerhalb meines Dienstes wird mein Timer nicht angesteuert.

hab jetzt zwei Timer gebaut und keiner von den beiden läuft. Kennt jemand das Phänomen ??

nahpets 5. Jan 2009 14:26

Re: Service und TTimer
 
Hallo,

habe mehrere Dienste mit Timern, die funktionieren alle.
Zeig' mal ein bisserl Code, eventuell fällt uns da ja was auf.

Aktivierst Du die Timer im Quelltext (z. B. beim Starten des Dienstes) oder hast Du sie schon in der Entwicklungsumgebung aktiviert?

Luckie 5. Jan 2009 14:27

Re: Service und TTimer
 
Normalerwese schickt Windows die Timernachrichten (WM_TIMER) an ein Fenster. Und da ein Dienst in der Regel kein Fenster hat, funktioniert das natürlich nicht.

Nutzt du die API Funktion MSDN-Library durchsuchenSetTimer direkt, kannst du eine Funktion angeben. Eventuell funktioniert das ohne Fenster.

Digielm 5. Jan 2009 14:31

Re: Service und TTimer
 
hier mal ein bissel Source


Delphi-Quellcode:





type
  Ttestform = class(TForm)
    adresstimer: TTimer;



procedure Ttestform.FormCreate(Sender: TObject);
begin

          adresstimer.Interval := 60000;
          adresstimer.Enabled := true;
end;

Sherlock 5. Jan 2009 14:31

Re: Service und TTimer
 
@Luckie: Wenn ich das aber richtig verstanden habe, dann erzeugt TTimer ein unsichtbares Fenster, daß die WindowsMessages entgegennehmen kann.

@Digielm: Und wird das Formular auch erzeugt und angezeigt?

Sherlock

nahpets 5. Jan 2009 14:32

Re: Service und TTimer
 
Hallo,

in meinen Dienste benutze ich immer TTimer bzw. eine von mir erweiterte Variante von TTimer. Das funktioniert problemlos.

Digielm 5. Jan 2009 14:33

Re: Service und TTimer
 
ja ne Form hab ich laufen welche aber nicht abgezeigt wird, da ja eben ein dienst

Digielm 5. Jan 2009 14:34

Re: Service und TTimer
 
Was hast du denn für eine Erweiterte TTimer kompo. ??

Ich hab auch schon TTimer in Diensten benutzt nur in diesem speziellen aben leider nicht. ach ja ist ne Delphi.net application

sakura 5. Jan 2009 14:35

Re: Service und TTimer
 
Leg den Timer doch mal direkt in den Dienst - wozu benötigst Du das Form überhaupt?

...:cat:...

sakura 5. Jan 2009 14:36

Re: Service und TTimer
 
Zitat:

Zitat von Digielm
ach ja ist ne Delphi.net application

Oben (erster Eintrag) hast Du aber Delphi Win32 ausgewählt. Welche Delphi-Version nutzt Du für .NET?

...:cat:...

Digielm 5. Jan 2009 14:38

Re: Service und TTimer
 
wenn ich dann form.show mache bleibt mein Dienst einfach hängen.

nahpets 5. Jan 2009 14:39

Re: Service und TTimer
 
Hallo,

wie machst Du das mit dem Formular im Dienst, wo wird das Formular erstellt und bist Du sicher, dass es zur Laufzeit erstellt wird?

Meine Dienste sind alle mit Delphi 7 erstellt.
Die eigene Komponente ist dahingehend erweitert, dass sie alle 5 oder 15 Minuten oder zur vollen Stunde, um 24 Uhr... pünktlich startet, unabhängig von dem Zeitpunkt, zu dem Enabled auf True gesetzt wird. Beim Aktivieren wird halt das Timerintervall errechnet, das erforderlich ist, um "pünktlich" zu starten.

sakura 5. Jan 2009 14:39

Re: Service und TTimer
 
Zitat:

Zitat von Digielm
wenn ich dann form.show mache bleibt mein Dienst einfach hängen.

Wie schon gefragt, wozu ist das Form überhaupt da? Brauchst Du dieses wirklich, wenn es eh nie ein Anwender sieht...

...:cat:...

Digielm 5. Jan 2009 14:40

Re: Service und TTimer
 
nee eigentlich brauch ich dir Form nur wenn ich mit dem ding am weiterentwickeln bin, dafür brauch ich die.

nahpets 5. Jan 2009 14:42

Re: Service und TTimer
 
Hallo,
Zitat:

Zitat von Digielm
wenn ich dann form.show mache bleibt mein Dienst einfach hängen.

Dienst und Formular, schließt sich das nicht gegenseitig aus?
Beim Show wird das Formular aktiv und wartet auf Benutzeraktionen, dass ist bei 'nem Dienst nicht unbedingt sinnvoll (zumal, wenn man das Formular nicht zu sehen bekommt :wink: )

sakura 5. Jan 2009 14:42

Re: Service und TTimer
 
Zitat:

Zitat von Digielm
nee eigentlich brauch ich dir Form nur wenn ich mit dem ding am weiterentwickeln bin, dafür brauch ich die.

Ich verstehe jetzt nichts - und mangels dessen klinke ich mich hier aus. Wozu einen Kopf machen, wenn ich keinen vernünftigen Input bekomme ;)

...:cat:...

Digielm 5. Jan 2009 14:49

Re: Service und TTimer
 
Nee hatte ich schon einige male gemacht und das klappt alles soweit

Digielm 5. Jan 2009 14:59

Re: Service und TTimer
 
Hier nochmal ein bissel Source

Delphi-Quellcode:
unit Service;

interface

uses
  System.Drawing, System.Collections, System.ComponentModel, Borland.Vcl.ExtCtrls,
  System.Windows.Forms, System.Data, system.serviceprocess, System.Configuration.Install;

type
//  [RunInstaller(true)]
  TService1 = class(System.ServiceProcess.ServiceBase)
  {$REGION 'Vom Designer verwalteter Code'} 
  strict private
    /// <summary>
    /// Erforderliche Designervariable.
    /// </summary>
    Components: System.ComponentModel.Container;
    /// <summary>
    /// Erforderliche Methode zur Unterstützung des Designers - 
    /// ändern Sie die Methode nicht mit dem Quelltext-Editor
    /// </summary>
    procedure InitializeComponent;
  {$ENDREGION} 
  strict protected
    /// <summary>
    /// Ressourcen nach der Verwendung bereinigen
    /// </summary>
    procedure Dispose(Disposing: Boolean); override;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  strict protected
    procedure OnStop; override;
    procedure OnStart(args: array of string); override;
  public
    constructor Create;
  end;
//
var
  Service1: TService1;

// [assembly: RuntimeRequiredAttribute(TypeOf(ServiceBase))]

implementation

uses Main;

//{$R *.nfm}
{$AUTOBOX ON} 

{$REGION 'Vom Windows Form-Designer erzeugter Code'} 
/// <summary>
/// Erforderliche Methode zur Unterstützung des Designers -- 
/// ändern Sie die Methode nicht mit dem Quelltext-Editor
/// </summary>
procedure TService1.InitializeComponent;
begin
  Self.Components := System.ComponentModel.Container.Create;
  Self.ServiceName := 'SAPConnect';
end;
{$ENDREGION}

procedure TService1.Dispose(Disposing: Boolean);
begin
  if Disposing then
  begin
    if Components <> nil then
      Components.Dispose();
  end;
  inherited Dispose(Disposing);
end;

constructor TService1.Create;
begin
  inherited Create;
  //
  // Erforderlich für die Unterstützung des Windows Forms-Designers
  //
  InitializeComponent;
  //
//  MessageBox.show('created');
  // TODO: Fügen Sie nach dem Aufruf von InitializeComponent Konstruktorcode hinzu.
  // 
end;


procedure TService1.onstop;
begin
//
end;

procedure TService1.OnStart(args: array of string);
begin
  Testform := TTestform.Create(self);
  Testform.show;
end;

end.
bei dem SHOW bleibt er eben hängen

Luckie 5. Jan 2009 15:01

Re: Service und TTimer
 
Und wo ist da jetzt der Timer?

Sherlock 5. Jan 2009 15:02

Re: Service und TTimer
 
Der liegt auf dem Testform.

Kann ja nicht gehen, da hier schon oft gesagt wurde: Dienst + Form = No go.

Sherlock

Digielm 5. Jan 2009 15:03

Re: Service und TTimer
 
hab ich auch schon gemacht und hat bis jetzt immer geklappt.

der Timer ist auf der Testform drauf.

Kann ich denn ggf auch nen Timer ohne forms o.ä. machen ??

Sherlock 5. Jan 2009 15:04

Re: Service und TTimer
 
Klar:
Delphi-Quellcode:
.
.
.
  private
    TimerUhr: TTimer;
.
.
.
timerUhr := TTimer.create(self);
timerUhr.Interval := 10000;
timerUhr.onTimer := TimerUhrTimer;
timerUhr.enabled       := true;
Sherlock

Digielm 6. Jan 2009 08:44

Re: Service und TTimer
 
Also hab das mal mit dem Create des times ausprobiert.

Aber leider krieg ich das ding nicht zum laufen :-( ich weiß nicht wieso oder warum :-(


Kann mir da jemand helfen ?

nahpets 6. Jan 2009 09:05

Re: Service und TTimer
 
Hallo,

häng' bitte mal Deinen Quelltext dran, so ist das doch ein bisserl arges Stochern im Nebel.

Digielm 6. Jan 2009 09:32

Re: Service und TTimer
 
Also hab grade mal folgendes Probiert

Delphi-Quellcode:
procedure TERPConnect.WndProc(var msg : TMessage);
begin
    addlogtext('Messages');
    inherited WndProc(msg);
end;
habe leider festgestellt das mein Dienst keinerlei Messages mehr übergibt wenn der Create ausgefürt wurde, d.h. nach dem das ganze created wurde geht nix mehr

Digielm 6. Jan 2009 09:39

Re: Service und TTimer
 
Hier der Project Source

Delphi-Quellcode:
program Testservice;

{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v2.0.50727\System.dll'}
{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v2.0.50727\System.Data.dll'}
{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v2.0.50727\System.Drawing.dll'}
{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v2.0.50727\System.XML.dll'}
{%DelphiDotNetAssemblyCompiler 'c:\programme\gemeinsame dateien\borland shared\bds\shared assemblies\4.0\Borland.Vcl.dll'}
{%DelphiDotNetAssemblyCompiler 'c:\programme\gemeinsame dateien\borland shared\bds\shared assemblies\4.0\Borland.Delphi.dll'}
{%DelphiDotNetAssemblyCompiler 'c:\programme\gemeinsame dateien\borland shared\bds\shared assemblies\4.0\Borland.VclRtl.dll'}
{%DelphiDotNetAssemblyCompiler '..\Borland.Data.Mssql.dll'}
{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v2.0.50727\System.Configuration.Install.dll'}
{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v2.0.50727\System.ServiceProcess.dll'}

uses
  windows,
  forms,
  System.Reflection,
  system.serviceprocess,
  System.Runtime.CompilerServices,
  Main in 'Main.pas',
  ccLog in '..\ccLog.pas',
  Service in 'Service.pas' {Service.TService1: system.serviceprocess.servicebase};

{$R *.res}

{$REGION 'Programm/Assemblierungs-Informationen'}
//
// Die allgemeinen Assemblierungsinformationen werden durch die folgenden
// Attribute gesteuert. Ändern Sie die Attributwerte, um die zu einer
// Assemblierung gehörenden Informationen zu modifizieren.
//

[assembly: AssemblyDescription('')]
[assembly: AssemblyConfiguration('')]
[assembly: AssemblyCompany('')]
[assembly: AssemblyProduct('')]
[assembly: AssemblyCopyright('')]
[assembly: AssemblyTrademark('')]
[assembly: AssemblyCulture('')]

// Der Delphi-Compiler steuert AssemblyTitleAttribute via ExeDescription.
// Sie können dies in der IDE über Projekt/Optionen festlegen.
// Wenn Sie das Attribut AssemblyTitle wie unten gezeigt manuell festlegen,
// wird die IDE-Einstellung überschrieben.
// [assembly: AssemblyTitle('')]


//
// Die Versionsinformation einer Assemblierung enthält die folgenden vier Werte:
//
//      Hauptversion
//      Nebenversion
//      Build-Nummer
//      Revision
//
// Sie können alle vier Werte festlegen oder für Revision und Build-Nummer die
// Standardwerte mit '*' - wie nachfolgend gezeigt - verwenden:

[assembly: AssemblyVersion('1.0.*')]

//
// Zum Signieren einer Assemblierung müssen Sie einen Schlüssel angeben. Weitere Informationen
// über das Signieren von Assemblierungen finden Sie in der Microsoft .NET Framework-Dokumentation.
//
// Mit den folgenden Attributen steuern Sie, welcher Schlüssel für die Signatur verwendet wird.
//
// Hinweise:
//   (*) Wenn kein Schlüssel angegeben wird, ist die Assemblierung nicht signiert.
//   (*) KeyName verweist auf einen Schlüssel, der im Crypto Service Provider
//      (CSP) auf Ihrem Rechner installiert wurde. KeyFile verweist auf eine
//       Datei, die einen Schlüssel enthält.
//   (*) Wenn sowohl der KeyFile- als auch der KeyName-Wert angegeben ist, wird
//      die folgende Verarbeitung durchgeführt:
//       (1) Wenn KeyName in dem CSP gefunden wird, wird dieser Schlüssel verwendet.
//       (2) Wenn KeyName nicht, aber KeyFile vorhanden ist, wird der Schlüssel
//           in KeyFile im CSP installiert und verwendet.
//   (*) Ein KeyFile können Sie mit dem Utility sn.exe (Starker Name) erzeugen.
//       Der Speicherort von KeyFile sollte relativ zum Projektausgabeverzeichnis
//       %Projektverzeichnis%\bin\<Konfiguration> angegeben werden. Wenn sich Ihr
//       KeyFile z.B. im Projektverzeichnis befindet, würden Sie das Attribut
//       würden Sie das Attribut AssemblyKeyFile folgendermaßen festlegen:
//       [assembly: AssemblyKeyFile('..\\..\\mykey.snk')]
//   (*) Verzögerte Signatur ist eine erweiterte Option; nähere Informationen
//       dazu finden Sie in der Microsoft .NET Framework-Dokumentation.
//
[assembly: AssemblyDelaySign(true)]
[assembly: AssemblyKeyFile('')]
[assembly: AssemblyKeyName('')]


//
// Verwenden Sie untenstehende Attribute, um die COM-Sichtbarkeit Ihrer Assembilierung zu steuern.
// Als Vorgabe ist die ganze Assemblierung für COM sichtbar. Das Setzen von ComVisible auf false
// ist die empfohlene Vorgabe für Ihre Assemblierung. Um eine Klasse und Interface für COM sichtbar
// zu machen, setzen Sie ComVisible für jeden Einzelnen auf true. Es wird auch empfohlen ein
// Guid-Attribut hinzuzufügen.
//

[assembly: ComVisible(False)]
//[assembly: Guid('')]
//[assembly: TypeLibVersion(1, 0)]
{$ENDREGION}

[STAThread]
begin
  Application.Initialize;
  System.ServiceProcess.ServiceBase.Run(Service.TService1.Create);
end.
service Source


Delphi-Quellcode:

unit Service;

interface

uses
  System.Drawing, System.Collections, System.ComponentModel,
  System.Windows.Forms, System.Data, system.serviceprocess, System.Configuration.Install;

type
//  [RunInstaller(true)]
  TService1 = class(System.ServiceProcess.ServiceBase)
  {$REGION 'Vom Designer verwalteter Code'}
  strict private
    /// <summary>
    /// Erforderliche Designervariable.
    /// </summary>
    Components: System.ComponentModel.Container;
    /// <summary>
    /// Erforderliche Methode zur Unterstützung des Designers -
    /// ändern Sie die Methode nicht mit dem Quelltext-Editor
    /// </summary>
    procedure InitializeComponent;
  {$ENDREGION}
  strict protected
    /// <summary>
    /// Ressourcen nach der Verwendung bereinigen
    /// </summary>
    procedure Dispose(Disposing: Boolean); override;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  strict protected
    procedure OnStop; override;
    procedure OnStart(args: array of string); override;
  public
    constructor Create;
  end;
//
var
  Service1: TService1;

// [assembly: RuntimeRequiredAttribute(TypeOf(ServiceBase))]

implementation

uses Main, toolsdotnet;

//{$R *.nfm}
{$AUTOBOX ON} 

{$REGION 'Vom Windows Form-Designer erzeugter Code'}
/// <summary>
/// Erforderliche Methode zur Unterstützung des Designers --
/// ändern Sie die Methode nicht mit dem Quelltext-Editor
/// </summary>
procedure TService1.InitializeComponent;
begin
  Self.Components := System.ComponentModel.Container.Create;
  Self.ServiceName := 'Testdienst';
end;
{$ENDREGION}

procedure TService1.Dispose(Disposing: Boolean);
begin
  if Disposing then
  begin
    if Components <> nil then
      Components.Dispose();
  end;
  inherited Dispose(Disposing);
end;

constructor TService1.Create;
begin
  inherited Create;
  //
  // Erforderlich für die Unterstützung des Windows Forms-Designers
  //
  InitializeComponent;
  //
  // TODO: Fügen Sie nach dem Aufruf von InitializeComponent Konstruktorcode hinzu.
  //
end;

procedure TService1.onstop;
begin
//
end;

procedure TService1.OnStart(args: array of string);
begin
  Mainform := TMainform.Create(self);
end;

end.
Mainform
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Borland.Vcl.StdCtrls, System.ComponentModel, Borland.Vcl.ComCtrls, System.Collections,
  Borland.Vcl.ExtCtrls, Microsoft.Win32, System.IO, System.Data.OleDb,
  System.Collections.Specialized, System.Text.RegularExpressions, System.Threading, System.Diagnostics,
  System.Data.SqlClient, System.Data, comobj;

type
  TMainform = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    adresstimer: TTimer;
  protected
    procedure WndProc(var msg : TMessage); override;
  end;

var
  Mainform: TMainform;

implementation

procedure TMainform.FormCreate(Sender: TObject);
begin
  adresstimer := TTimer.Create(application.MainForm);
  adresstimer.OnTimer := Button1Click;
  adresstimer.Interval := 60000;
  adresstimer.Enabled := true;
end;

procedure TMainform.Button1Click(Sender: TObject);
begin
  addlogtext('Starte abgleich');
end;
end.

Sherlock 6. Jan 2009 09:43

Re: Service und TTimer
 
Hmmm, den Timer würde ich eigentlich in Deinem Service erzeugen, nicht auf dem Form...

Sherlock

Digielm 6. Jan 2009 09:44

Re: Service und TTimer
 
Hab ich auch versucht klappt auch da nicht :-(

Keine Ahnunug warum ich keinerlei MSG bekomme

nahpets 6. Jan 2009 09:58

Re: Service und TTimer
 
Hallo,

wat passiert denn hier?

Delphi-Quellcode:
procedure TService1.OnStart(args: array of string);
begin
  addlogtext('Start OnStart');
  Try
    Mainform := TMainform.Create(self);
  Except
    on e : Exception Do addlogtext(e.Message);
  end;
  addlogtext('Ende OnStart');
end;
Welche Logeinträge bekommst Du zu sehen?

Digielm 6. Jan 2009 10:00

Re: Service und TTimer
 
das hier passiert in meinem Log

06.01.2009 10:59:41 Start OnStart
06.01.2009 10:59:41 Dienst gestartet
06.01.2009 10:59:41 Ende OnStart

nahpets 6. Jan 2009 10:30

Re: Service und TTimer
 
Zitat:

Zitat von Digielm
das hier passiert in meinem Log

06.01.2009 10:59:41 Start OnStart
06.01.2009 10:59:41 Dienst gestartet
06.01.2009 10:59:41 Ende OnStart

Langsam kapiere ich nix mehr, wo kommt denn bitte das Dienst gestartet her?
Delphi-Quellcode:
procedure TService1.OnStart(args: array of string);
begin
  addlogtext('Start OnStart');
  Try
    Mainform := TMainform.Create(self);
  Except
    on e : Exception Do addlogtext(e.Message);
  end;
  addlogtext('Vor Button1Click');
  Try
    MainForm.Button1Click(Nil);
  Except
    on e : Exception Do addlogtext('Fehler in Button1Click: ' + e.Message);
  end;
  addlogtext('Hinter Button1Click');
  Try
    MainForm.Adresstimer.Enabled := false;
    MainForm.Adresstimer.Interval := 1000;
    MainForm.Adresstimer.Enabled := true;
  Except
    on e : Eception do addlogtext('Fehler beim Aktivieren des Timers: ' + e.Message);
  end;
  addlogtext('Ende OnStart');
  // Eine Sekunde hinter dem 'Ende OnStart' sollte im Log ein Eintrag 'Starte abgleich' stehen.
  // Wenn nicht, weiß ich auch nicht mehr weiter.
end;

Digielm 6. Jan 2009 10:57

Re: Service und TTimer
 
selbst wenn ich das hier mache

Delphi-Quellcode:
unit Service;

interface

uses
  System.Drawing, System.Collections, System.ComponentModel, svcmgr,
  System.Windows.Forms, System.Data, system.serviceprocess, System.Configuration.Install;

type
  [RunInstaller(true)]
  TService1 = class(System.ServiceProcess.ServiceBase)
  {$REGION 'Vom Designer verwalteter Code'}
  strict private
    /// <summary>
    /// Erforderliche Designervariable.
    /// </summary>
    Components: System.ComponentModel.Container;
    /// <summary>
    /// Erforderliche Methode zur Unterstützung des Designers -
    /// ändern Sie die Methode nicht mit dem Quelltext-Editor
    /// </summary>
    procedure InitializeComponent;
  {$ENDREGION}
  strict protected
    /// <summary>
    /// Ressourcen nach der Verwendung bereinigen
    /// </summary>
    procedure Dispose(Disposing: Boolean); override;
  private
    { Private-Deklarationen }
    Timer1 : System.Windows.Forms.Timer;
    procedure timer(sender: TObject; e: System.EventArgs);
  public
    { Public-Deklarationen }
  strict protected
    procedure OnStop; override;
    procedure OnStart(args: array of string); override;
  public
    constructor Create;
  end;
//
var
  Service1: TService1;

// [assembly: RuntimeRequiredAttribute(TypeOf(ServiceBase))]

implementation

uses Main, ccLog;

//{$R *.nfm}
{$AUTOBOX ON} 

{$REGION 'Vom Windows Form-Designer erzeugter Code'}
/// <summary>
/// Erforderliche Methode zur Unterstützung des Designers --
/// ändern Sie die Methode nicht mit dem Quelltext-Editor
/// </summary>
procedure TService1.InitializeComponent;
begin
  Self.Components := System.ComponentModel.Container.Create;
  Self.ServiceName := 'Testdienst';
end;
{$ENDREGION}

procedure TService1.Dispose(Disposing: Boolean);
begin
  if Disposing then
  begin
    if Components <> nil then
      Components.Dispose();
  end;
  inherited Dispose(Disposing);
end;

constructor TService1.Create;
begin
  inherited Create;
  //
  // Erforderlich für die Unterstützung des Windows Forms-Designers
  //
  InitializeComponent;
  //
  // TODO: Fügen Sie nach dem Aufruf von InitializeComponent Konstruktorcode hinzu.
  //
end;

procedure TService1.onstop;
begin
//
end;

procedure TService1.timer(sender: System.Object; e: System.EventArgs);
begin
  addlogtext('STarte timerevent');
end;


procedure TService1.OnStart(args: array of string);

begin
  Try
    Timer1 := System.Windows.Forms.Timer.Create;
    Timer1.Interval := 10000;
    Include(Self.timer1.Tick, timer);
    addlogtext('Start OnStart');
    Main.create;
  Except
    on e : Exception Do addlogtext(e.Message);
  end;
  addlogtext('Ende OnStart');
  Timer1.Start;

end;



end.
klappt das nicht :-(

nahpets 6. Jan 2009 11:16

Re: Service und TTimer
 
Hallo,

da weiß ich nun auch nicht mehr weiter, lass' mal das Main.Create weg, wenn das dann immer noch nicht geht, geb' ich's dran.


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