Laden...

Fenster mit Dienst öffnen

Erstellt von raffi vor 19 Jahren Letzter Beitrag vor 19 Jahren 4.550 Views
R
raffi Themenstarter:in
10 Beiträge seit 2004
vor 19 Jahren
Fenster mit Dienst öffnen

Hallo Leutz,

kann mir bitte mal jemand genauer erklären, wie ich beim Starten eines mit C# erstellten Dienstes ein dazugehöriges Form öffnen kann? Krieg das nicht richtig auf
die Reihe.

Thanx und Grüße

Raffi

C
980 Beiträge seit 2003
vor 19 Jahren

Dienste sind normalerweise nicht an eine graphische Session gebunden (und laufen entsprechend auch schon wenn du noch gar nicht eingelogt bist) - ist ja auch der Zweck eines Dienstes.

Fall du eine GUI zur Steuerung des Dienstes brauchst kannst es ja z.b. ähnlich lösen wie MS mit dem SQL Server Service Manager (der Service Manager läuft als traybar app) ... wie du dann von der GUI aus mit dem Dienst kommunizieren kannst siehst du z.b. hier

R
raffi Themenstarter:in
10 Beiträge seit 2004
vor 19 Jahren

Hi CDR!

Vielen Dank für die Antwort und den Link. Du meinst also, ich soll das über IPC lösen? Ups, sind ja harte Bandagen, die ich mir da anlegen muß. Komplettes Neuland. Ich kannte das nur zum Beispiel von Centura SQLBase (Gupta). Da lief das Teil als Dienst, - mit einer dazugehörigen GUI, die sich nicht auf normalem Weg schließen ließ. War dann sicherlich C++ IPC. Gut, ich werd also mal rumdoktern, mal sehen, ob ichs hinkriege.

Thanx nochmals und Greetz

Raffi

C
980 Beiträge seit 2003
vor 19 Jahren

Must du denn umfangreiche Daten hin und herschieben, oder geht es eher um kleinere Steuerbefehle?

(btw: mit meinem Framework im Artikel dürfte es so aufwändig nicht sein 😉

R
raffi Themenstarter:in
10 Beiträge seit 2004
vor 19 Jahren

Es geht eigentlich nur um Read-Geschichten. Kurz erklärt: Die Dienste steuern das Abspielen von unterschiedlichen multimedialen Inhalten auf bis zu 6 Displays. Dazu greifen sie auf eine MySQL-Datenbank zurück, die Abspielreihenfolgen und -zeiten etc. enthält und warten auf bzw. verarbeiten bestimmte Daten, die über eine RS232- oder RS483-Schnittstelle angeliefert werden (BTW: Gibt es da eine gute Library für so'n Zeug?). Das Frontend soll eigentlich nur anzeigen, was gerade passiert, - der einzige "echte" Schreibzugriff ist der, daß die Abspieldaten zu Auswertungs- und Verrechnungszwecken wieder in die SQL-Datenbank zurückgeschrieben werden, aber das steht eh auf einem anderen Blatt.
Hab mir mal die IPC-Library von Sourceforge gezogen. Ist ja doch nicht so hardcore, wie ich angenommen habe.

r
a
f
f
i

C
980 Beiträge seit 2003
vor 19 Jahren

Ok, das könnte wahrscheinlich gut mit Memory Mapped Files oder mit Named Pipes realisiert werden. Ich werd übrigens in den nächsten Tagen ne neue Version freigeben die auch die MSMQ und Named Pipes abdeckt (vielleicht reicht die Zeit auch noch für eine TCP bridge)

MSMQ wäre sonst evtl auch eine Möglichkeit hier, ist (im gegensatz zu den anderen Varianten) vom .NET Framework selbst vollständig unterstützt (System.Messaging Namespace)

Läuft das Form immer wenn der Service läuft, oder nur ab und zu? Sonst müsstest du noch irgendwie absichern dass der Service nicht einfach die ganzen Buffer vollschreibt und sich blockiert, ohne dass diese jemand wieder ausliest/leert ...

F
529 Beiträge seit 2003
vor 19 Jahren

Warum lässt du den Dienst das nicht einfach in eine Datei schreiben die du mit dem FileSystemWatcher im kleinen Frontend ausliest, wenn die Datei geändert wurde... Aber vielleicht ist es ja sogar möglich das mit Sockets zu lösen.... 😁

Ist das Ding von dir, cdr? Das ist nämlich zimlich nützlich!

--
mfg
Franknstein

Besuchen sie das VisualC++ - Forum

C
980 Beiträge seit 2003
vor 19 Jahren

Meinst du ThreadMessaging und der CP Artikel? Ja, hab ich in den letzten par tagen geschrieben (und bin es gerade am erweitern) ... war ne gute Übung für die Vorlesung 'Technische Informatik II' 😉 (-> eine der 12 Prüfungen im Herbst)

R
raffi Themenstarter:in
10 Beiträge seit 2004
vor 19 Jahren

Ja, bezüglich MMF dachte ich mir das auch, nachdem ich mir die Beispiele bei Codeproject und die Demo mal genauer angesehen habe. Message Queues wären halt - wie Du ja auch schreibst - schon vollständig integriert. Weiß selber noch nicht richtig, welchen Weg ich da einschlagen soll. Naja, hab ja das Wochenende, um zu testen. Nix mit Baden gehen. X(

Das Form soll nur nach dem Login laufen. Es wird einfach über RunOnce einmalig gestartet und verankert sich dann im Tray. Wie sieht es denn bei MSMQs aus, besteht da eine Gefahr, daß der Puffer voll wird? Oder kann man da sozusagen ein TTL angeben und die Message fliegt nach einer bestimmten Zeit einfach raus?
Was hältst Du von der Idee, daß der Dienst keinen Buffer beschreibt, solange er keinen Prozeß findet, der zum Form gehört? Klingt für mich am einfachsten.

R
raffi Themenstarter:in
10 Beiträge seit 2004
vor 19 Jahren

Das mit einem oder mehreren Logfiles hab ich mir anfangs auch mal überlegt. Aber ein bißchen Herausforderung muß sein. Gehe da lieber Wege, die komplett neu für mich sind. Lern ich wenigstens was dabei. 🙂
Was mir gefallen würde, wäre ne Kommunikation zwischen den Diensten bzw. zwischen Diensten und Frontend über IP und Ports. Damit habe ich mich aber auch nie auseinander gesetzt und hab keine Ahnung wie aufwendig das ist.

F
529 Beiträge seit 2003
vor 19 Jahren

Mach einen Ringbuffer, der kann nämlich nicht überlaufen falls keine Nachrichten mehr ausgelesen werden

--
mfg
Franksntein

Besuchen sie das VisualC++ - Forum

C
980 Beiträge seit 2003
vor 19 Jahren

Das Problem mit Buffer füllen ist nur relativ - das frontend muss dem dienst einfach sagen wann es etwas senden soll, oder implizit durch stetige ACKs ... falls du im service dafür einen thread opfern kannst ist es noch einfacher, dann wird dieser thread einfach blockiert wenn niemand was abfragt (und verbrät entsprechend auch null Rechenleistung).

Sockets sind natürlich auch eine möglichkeit, sind aber aufwändiger (und sicher langsamer) als MMF und auch Named Pipes.

Eine weitere möglichkeit wären auch Mail Slots, die arbeiten mit UDP und scheren sich kaum ob die Nachrichten auch irgend jemand liest oder nicht ...

btw: ich verwende bei MMF auch ringbuffer, aber ich lasse ihn natürlich blockieren wenn er voll ist... (ist ja genau der punkt dabei, stichwort SOA)