Laden...

Datenaustausch zwischen Programmen >Event hinzufügen?<

Letzter Beitrag vor 14 Jahren 6 Posts 2.224 Views
Datenaustausch zwischen Programmen >Event hinzufügen?<

Servus!

Ich hoffe mal, ich bin hier richtig...

Also, mal zu meinem Problem: Ich habe eine Hauptanwendung welche mehrere kleine Programme startet. Diese erledigen unabhängig voneinander ihre Aufgaben. Die Frage ist, wie eines der Kind-Programme dem Hauptprogramm mitteilt, wenn Ergebnisse vorliegen.

Um der Frage vorzubeugen warum das Ganze:
Es handelt sich um ein recht komplexes modulares Messsystem. Das Hauptprogramm kümmert sich nur um die Speicherung bzw. das weiterversenden der Daten. Je nachdem welche Messsysteme installiert sind, wird passend zum Messsystem in einem AddOn-Ordner ein kleines App installiert, welches die Daten ausliest und ggf. auswertet.
Das Hauptprogramm schaut in einem Ordner, welche Programme dort liegen, startet die Programme (derzeitig in einer AppDomain über ExecuteAssembly). Die Daten werden dann über einen ObjectHandle ausgelesen und mittels XMLSerializer gespeichert (Somit muss ich nicht wissen, was da kommt). Funktioniert auch Prima. Nur, dass das Auslesen aktuell über einen Timer läuft, was ich nicht sehr schön finde und außerdem können dadurch Daten verloren gehen bzw durcheinander geraten.

lg noman

Die Frage ist nun, ob es eine Möglichkeit gibt, dem Hauptprogramm über ein Event mitzuteilen, wenn in einem der Kind-Programme neue Daten vorliegen. Oder sollte ich einen ganz anderen Weg einschlagen?

Hi,

(denke mal der falsche bereich)

ich hätte da nen Vorschlag, ich hatte ne Art verwandtes Problem. Ich würde dir Vorschlagen ne Thread Sichere Queue zu nehmen
s. hier

Dann könntest du, wie du selbst vorgeschlagen hast, per event deinem Hauptprogramm mitteilen, dass ein Ergebnis da ist und die Daten sofort mit über geben.
Die Daten kannst du dann in die Warte Schlange einfügen.

Entweder kannste dann per Timer ne Methode machen, wo du guckst, ob was im Queue drin ist und das dann nach und nach wegschreiben. Alternativ könnteste auch nen Thread machen der die Aufgabe übernimmt. Den kannste ggf. schlafen schicken, wenn keine nichts zum wegschreiben da ist.

Ich hoffe das hilft dir weiter

MfG
S4rge

Hi.

Vielleicht reicht auch ein FileWatcher-Objekt? Damit solltest du die Dateien in Echtzeit kriegen und hast nicht den Aufwand einer Kommunikation zwischen den Programmen.

Lars

Danke für die Antworten.

Ich werde beides mal ausprobieren und schauen was schneller ist. Das mit dem threadsicheren Queue klingt ganz gut. Auch wenn ich dann trotzdem nicht auf den Timer verzichten kann.

Danke nochmal!

Hallo, also ich bin schon länger inaktiv und daher etwas eingerostet, aber ich denke es müsste ein Handle geben für Deine Objekte z.B. wenn Dein Hauptfenster ein Edit-Feld hat, hat dieses Edit Feld ein Handle über das Du es ansteuern kannst. Wenn Du dieses Handle Deinen Nebenanwendungen gibst, könnten diese z.B. das Edit-Feld füllen.
Würde dabei evtl. das Change-Ereignis auftreten hättest Du das Problem gelöst.

Das Hauptprogramm schaut in einem Ordner, welche Programme dort liegen, startet die Programme (derzeitig in einer AppDomain über ExecuteAssembly).

Sind diese Programme von dir? kannst du sie modifizieren? dann kannst du die Kommunikation zwischen diesen Programmen und dem Host-Programm über Remoting oder WCF gewährleisten.

Wenn diese Programme von externen stammen und einzige möglichkeit für die Kommunikation bzw. Ergebnis-Rückgabe sind Dateien die diese Programme speichern, kannst du sie folgendermaßen starten

1)
für jedes Programm ein getrenntes Thread starten

2)
im jeweiligen Thread startest du das programm und wartest auf sein Ende

var p = Process.Start("programA");
p.WaitForExit();

Danach prüfst du Dateien die das programA hinterlassen soll

4)
Um benachrichtigt zu werden ob alle threads/programme beendet wurden nutzst du die thread-synchronizierung methode WaitHandle.WaitAll(..)