Autor Beitrag
annabert
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 21.06.10 12:58 
Hallo,

ich bin neu hier. Sorry wenn ich meine Frage im falschen Bereich poste:

Ich habe drei Applikationen, die zusammengehören, und möchte in Applikation zwei sehen, ob Applikation eins und drei auf irgendeinem Rechner im Netzwerk laufen, und benachrichtigt werden, falls sie nicht mehr laufen oder wieder gestartet werden. Die Applikationen greifen auf die selbe DLL zu.
Zunächst habe ich mir das so vorgestellt:
Eine Applikation wird gestartet, und setzt über eine statische Funktion der DLL eine entsprechende Property - ebenfalls in der DLL - zur Indikation dass sie nun läuft. Diese Funktion löst ein Event in Applikation zwei aus.

Hier der abstrahierte Ansatz:

DLL:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
public static class ApplicationsClass
{
  private static bool isApplication1Running;
  private static bool isApplication2Running;
  public enum ApplicationsEnum
  {
    Application1 = 1,
    Application2 = 2
  }
  public static bool IsApplication1Running
  {
    get { return isApplication1Running; }
    set { isApplication1Running = value; }
  }
  public static bool IsApplication2Running
  {
    get { return isApplication2Running; }
    set { isApplication2Running = value; }
  }
  public delegate void ApplicationStartedDelegate(ApplicationsEnum application);
  public static event ApplicationStartedDelegate ApplicationStartedEvent;
  public static void SetApplicationRunning(ApplicationsEnum application)
  {
    switch (application)
    {
      case ApplicationsEnum.Application1:
        IsApplication1Running = true;
        ApplicationStartedEvent(ApplicationsEnum.Application1);
        break;
      case ApplicationsEnum.Application2:
        IsApplication2Running = true;
        ApplicationStartedEvent(ApplicationsEnum.Application2);
        break;
      default:
        break;
    }
  }
}


In der jeweiligen Applikation würde dann beim Starten einfach SetApplicationRunning() aufgerufen werden.

Nun habe ich mir vorgestellt, dass ein instantiiertes ApplicationStartedEvent() in einer Applikation hierdurch ausgelöst werden könnte.
Dies habe ich auf diesem Wege nicht hinbekommen. Ist so etwas möglich? Oder ist diese Vorgehensweise vielleicht nicht sinnvoll?

PS: Leerzeilen im Codeabschnitt wurden nicht übernommen, dafür waren am Ende zu viele. Was mache ich falsch?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 21.06.10 13:18 
Dein Ansatz kann so nicht funktionieren, da jede DLL-Instanz (deiner drei Applikationen) über ihren eigenen Datenbereich verfügt (d.h. die statischen Member existieren jeweils separat je DLL-Instanz (Applikation)).

Du mußt dich wohl mit IPC (Interprocess Communication) auseinandersetzen.

Für diesen Beitrag haben gedankt: annabert
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 21.06.10 13:37 
Mehr als das, da die Anwendungen auf verschiedenen Rechnern laufen, wird zusätzlich noch eine Netzwerkkommunikation nötig. Da ist in diesem Fall z.B. ein Broadcast via UDP möglich um die anderen Rechner zu finden.

Für diesen Beitrag haben gedankt: annabert
annabert Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 21.06.10 14:02 
Vielen Dank für die Antworten.

Also gibt es nicht so etwas wie eine statische DLL, schade. Ich müsste eigentlich nicht wissen auf welchem Rechner die Applikationen laufen, nur dass sie überhaupt laufen, daher dieser Ansatz.
Davor hatte ich eine primitive Lösung:
Beim Start einer Applikation wurde ein Eintrag in eine entsprechende Textdatei geschrieben, beim Beenden wieder gelöscht.
Dies hat funktioniert, es gab allerdings manchmal Probleme mit geöffneten Streams beim schnellen Starten und Beenden einer Applikation.
Nungut, dann mache ich mich an die von Euch genannten Themen, die interessieren mich sowieso.
annabert Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 23.06.10 10:10 
Die von euch vorgeschlagene Herangehensweise wäre etwas zu aufwändig für meinen Bedarf gewesen, daher habe ich mich entschieden dies über eine Datenbank, auf die sowieso alle Applikationen zugreifen, zu lösen. Jede Applikation trägt sich ein und trägt sich wieder aus, so kann jede Applikation sehen welche Applikationen auf welchen Rechnern laufen.