AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

was macht Dienst gerade?

Ein Thema von Susanne · begonnen am 15. Nov 2004 · letzter Beitrag vom 18. Feb 2005
Antwort Antwort
Seite 1 von 2  1 2      
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#1

was macht Dienst gerade?

  Alt 15. Nov 2004, 10:30
Hallo,

ich habe einen Dienst, der verschiedene Programme startet. Dann habe ich noch ein anderes Programm, hier würde ich gerne in einer StatusBar anzeigen, welches Programm der Dienst gerade gestartet hat! Geht das? Wenn ja, wie mache ich das?

Gruss
Susanne
Susanne
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: was macht Dienst gerade?

  Alt 15. Nov 2004, 10:32
Hi Susanne,

du könntest z.B. mit einer Logdatei arbeiten, in die der Dienst reinschreibt, und im Programm regelmäßig den letzten Logeintrag auslesen und anzeigen. Weiters gibts noch einen Weg über Messages, aber davon hab ich leider keine Ahnung

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#3

Re: was macht Dienst gerade?

  Alt 15. Nov 2004, 10:35
Hallo,

ich weiß nicht ob ein Dienst Messages an ein Userland Programm so einfach senden kann, was aber auf jedenfall geht sind Named Pipes. Bei bedarf hab ich irgendwo @home auch noch Code rumliegen wo ich das mal gemacht habe...
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#4

Re: was macht Dienst gerade?

  Alt 15. Nov 2004, 12:00
Bedarf ist vorhanden, das wäre ganz lieb, Danke schon mal
Susanne
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#5

Re: was macht Dienst gerade?

  Alt 15. Nov 2004, 20:09
Hallo,

inzwischen hab ichs gefunden. Man binde einfach die Unit die Anbei ist ein.

Im Dienst macht man dann folgendes:

Man nehme ein TMultiServerPipe Objekt, welches man z.B. im ServiceStart des Dienstes so initialisiert:
MultiServerPipe:=TMultiServerPipe.Create('MyFunnyPipe'); .

Um jetzt Daten zu empfangen muß man sich in das MultiServerPipe.onReadData ereignis einklinken.
Das ReadData muß als Methode wie folgt definiert sein:
procedure ReadData(Sender: TObject; ServerPipe: TAbstractPipe; Buffer: Pointer; BuffSize: DWord); Dort drinne kann man auf empfangene Daten in Buffer zugreifen (die die Größe BuffSize haben). Zum direkten antworten an den Sender macht man einfach ein ServerPipe.Write(Buffer,BufferGröße,GeschriebeneBy tes). In GeschriebeneBytes stehen dann die übertragenen Byte Anzahl.

Auf der CLient Seite ist das dann analog, nur das man statt TMultiServerPipe ein TClientPipe nehmen muß.

Der Dienst unterstütz somit von haus aus mehrere parallele Verbindungen, d.h. wenn man vom Dienst außerhalb des ReadData an einen Client senden will, brauch man dessen Verbindungsobjekt, im Prinzip alles änlich den Socket komponenten von Delphi.

Hoffe es war nicht allzuviel unverständliches dabei...
Angehängte Dateien
Dateityp: pas pipes.pas (9,4 KB, 32x aufgerufen)
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#6

Re: was macht Dienst gerade?

  Alt 16. Nov 2004, 08:57
Danke, aber so ganz steige ich da noch nicht durch.

Ich habe meinen Dienst und der Soll Daten senden. Die Funktionen des Dienstes sind in einem Thread. Ich habe die unit pipes in mein Projekt eingebunden. und nun habe ich folgendes gemacht


Delphi-Quellcode:
constructor TMThread.Create(CreateSuspended: Boolean);
  begin
    inherited Create(CreateSuspended);
    Priority := tpLowest;
    //PipeLine erzeugen
    MultiServerPipe:=TMultiServerPipe.Create('DienstAktuell');
  end;
und an der Stelle, an der er nun Daten senden soll, z.B. welches Programm er startet da kommt dann was hin? Programm ist die Variable, die das aktuell auszuführende Programm enthält. Was muss statt BuffSize in dem Aufruf stehen? Und das Write bekomme ich auch nicht aufgelistet, wenn ich den Punkt mache.

MultiServerPipe.Write(Programm, sizeof(Programm), BuffSize); Und mein anderes Programm soll diese Nachricht dann in seiner Oberfläche anzeigen. Dazu brauche ich dann ein TClientPipe. Das erzeuge ich z.B: im OnActivate-Ereignis mit?:
ClientPipe.Create('DienstAktuell'); Bei der Create-Methode will er aber noch einen Parameter haben, FSecurityAttributes.

Und wie lese ich dann, was der Dienst gesendet hat? Und was muss dann bei Sender und ServerPipe stehen? Buffer enthält den gesendeten Text und BuffSize die Grösse des Textes.
ClientPipe.OnReadData(Sender: TObject; ServerPipe: TAbstractPipe; Buffer: Pointer; BuffSize: DWord);
Susanne
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#7

Re: was macht Dienst gerade?

  Alt 16. Nov 2004, 09:29
Zitat von Susanne:
Was muss statt BuffSize in dem Aufruf stehen?
Einfach eine passende Variable die die Anzahl der erfolgreich geschriebenen Bytes aufnehmen kann. Du mußt das ja dann nicht unbedingt weiter beachten, nur brauch er halt ne Variable wo er das reinschreiben darf.

Zitat von Susanne:
Und das Write bekomme ich auch nicht aufgelistet, wenn ich den Punkt mache.
Das liegt daran weil das TMultiServerPipe selbst keine Verbindungen enthält sondern nur auf eingehende Verbindungen wartet. Die existierenden Verbindungen (es könnten sich ja mehrere Programm gleichzeitig verbinden) sind in dem TMultiServerPipe.Servers Array enthalten welche jedes ein TServerPipe Objekt representieren. Mit dem kannst du dann ein write machen. Die Anzahl der Verbindungen bekommt man über Servers.Count heraus.

Zitat von Susanne:
Und mein anderes Programm soll diese Nachricht dann in seiner Oberfläche anzeigen. Dazu brauche ich dann ein
TClientPipe. Das erzeuge ich z.B: im OnActivate-Ereignis mit?:
OnActive tritt doch immer auf wenn die Anwendung den Focus erhält - besser ist denke ich das onCreate.

Zitat von Susanne:
Bei der Create-Methode will er aber noch einen Parameter haben, FSecurityAttributes.
Mist, übersehen. Man kann den Zugriff auf Pipes beschränken (es gibt auch beim Server ein Create mit FSecurityAttributes Parameter). Der einfache Weg ohne ist folgender:

Delphi-Quellcode:
var
  sa: _SECURITY_ATTRIBUTES;

//...
  sa.nLength:=sizeof(sa);
  sa.lpSecurityDescriptor:=nil;
  sa.bInheritHandle:=false;
  foo = TClientPipe.Create('DienstAktuell',sa);
Zitat von Susanne:
Und wie lese ich dann, was der Dienst gesendet hat? Und was muss dann bei Sender und ServerPipe stehen? Buffer enthält den gesendeten Text und BuffSize die Grösse des Textes.
ClientPipe.OnReadData(Sender: TObject; ServerPipe: TAbstractPipe; Buffer: Pointer; BuffSize: DWord);
Also wie gesagt, im Server bzw. Client für das onReadData Ereignis registrieren (in der Read Funktion des Clients fehlt der ServerPipe Parameter - dort ist ja immer klar woher es kommt). In dem Speicher wo der Buffer Pointer hinzeigt stehen deine Daten, also z.B.:

Delphi-Quellcode:
// Definition die in beiden gleich sein muß, also am besten in eine gemeinsame Unit rein!
type
  PDienstStatusTyp = ^DienstStatusTyp;
  DienstStatusTyp = record
                      ok: boolean;
                      foo: integer;
                      text: shortstring; // wir können hier keine Pointer verwenden da Daten direkt zum Array gehören müssen - ein ShortString ist ein festes Array!
                    end;

// Client:
procedure TForm1.ReadData(Sender : TObject; Buffer : Pointer; BuffSize : DWord);
begin
   // Übertragungslänge paßt nicht... :-(
  if BuffSize <> sizeof(DienstStatusTyp then
  begin
    ShowMessage('Fehler!');
    exit;
  end;

  ShowMessage(PDienstStatusTyp(Buffer)^.text);
end;

// Server:
var
  h: DienstStatusTyp;
  b: Integer;

//...

for i:=0 to MultiServerPipe.Servers.Count do
begin
  h.text = 'Hallo Client '+IntToStr(i);
  MultiServerPipe.Servers[i].write(h,sizeof(h),b);
end;
es empfiehlt sich vielleicht am Anfang das mal nicht als Dienst durchzuspielen, es können bei den Operationen mit der Pipe Exceptions auftreten die man abfangen muß (vorallem im Dienst, wenn der sich aufhängt ist man sonst sehr oft am rebooten während der Entwicklung ).
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#8

Re: was macht Dienst gerade?

  Alt 16. Nov 2004, 10:15
Ok, heute kapiere ich irgendwie gar nichts. Hast du vielleicht irgendwo auch noch ein Beispiel rumliegen, das ich mir angucken könnte, um dahinter zu steigen?

[edit=Christian Seehase]Doppelpost gelöscht. Mfg, Christian Seehase[/edit]
Susanne
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#9

Re: was macht Dienst gerade?

  Alt 16. Nov 2004, 22:45
Hallo,

ich habe jetzt eben mal aus dem alten Projekt die wichtigen Sachen rausgezogen und in zwei normale Anwendungen verpackt. Wenn man ganz brav die Server.exe startet, dort den Create Button und danach die Client.exe und den Create Button drückt dann funzt es auch.

Sobald aber eine Exception im Constructor Auftritt (wenn z.B. der Server noch nicht läuft) dann hängt das Programm total anstatt das man die Exception angezeigt bekommt. Als ich das das letzte mal gemacht habe war dem nicht so allerdings war das noch Win2000+Delphi6 und nicht WinXP+Delphi7. Es sieht so aus als macht da Delphi Müll, jedenfalls macht er Unsinn beim debuggen mit Einzelschritt. Das muß ich erstmal genauer untersuchen....
Angehängte Dateien
Dateityp: zip pipedemo.zip (421,4 KB, 28x aufgerufen)
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#10

Re: was macht Dienst gerade?

  Alt 17. Nov 2004, 08:38
Danke für das Beispiel und die Mühe, werde mir das da dann mal genauer angucken.
Susanne
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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