"Georg Hübner" <
huebne...@t-online.de> schrieb im Newsbeitrag news:kgte16$hgb$1...@dont-email.me...
> Hallo,
>
>>Schuss ins Blaue: Vermutlich ein Thread-Problem. Das Timer-Ereignis
>>wird in einem anderen Thread-Kontext als dem der Datenbank-Connection
>>gefeuert.
>>TTimer erzeugt ein verstecktes Fenster beim Create und das Ereignis
>>OnTimer wird immer im Kontext desjenigen Threads gefeuert, in dem
>>das Fenster zuvor erzeugt wurde. TService besitzt standardmäßig einen
>>Service-Thread und einen Haupt-Thread.
>
> Nein, ich glaube nicht, dass Threads hiebei keine Rolle spielen. In beiden
> Fällen wird eine Form verwendet auf der der Timer und die IB-Komponenten
> plaziert sind. Hier spielt sich alles im selben Hauptthread der Form ab.
Nein, denn du erzeugst deine Form im ServiceThread im Ereignis TService1.ServiceStart.
Grundsätzlich ist das, insbesondere in neueren Delphiversionen problematisch,
denn die VCL ist nicht **threadsicher**. Jede Verwendung von Forms ausserhalb
des Hauptthreads kann zu ernsthaften Problemen führen.
Denn schon bei der Initialisierung der Forms-Unit wird mindestens ein
Fenster erzeugt (seit D2007?), was die Benutzung der Forms.pas (VCL) auf den
Hauptthread beschränkt.
> Das Timer-Ereignis wird nur einmal in der Minute aufgerufen.
Das ist natürlich unerheblich.
>
> Beim Service wird im Start-Ereignis die Form erst erzeugt...
>
> procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
> begin
> Form1:=TForm.Create(self);
> end;
Dieses Ereignis feuert im Service-Thread, nicht im Haupt-Thread.
> ...und beim Stop-Ereignis wieder frei gegeben.
>
> procedure TTankService.ServiceStop(Sender: TService; var Stopped: Boolean);
> begin
> Form1.Free;
> end;
Auch dieses Ereignis feuert im Service-Thread.
>
> Diese Methode hat sich bis jetzt bewährt und hat den Vorteil, dass man
> die Form nur einmal aufbaut und sie in beiden Fällen unverädert einsetzen kann.
Ändere das Design, es ist buggy.
--
Arno