Announcement

Collapse
No announcement yet.

Problem mit Prozess

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit Prozess

    Ich habe 2 Anwendungen.

    Anwendung 2 lädt Daten in ein Objekt xy.

    Anwendung 1:

    Dim Druckauftrag As New System.Diagnostics.Process()
    DruckauftragProzess.StartInfo.FileName = PfadAnwendung2.exe
    DruckauftragProzess.Start()


    Ich will in Anwendung 1 nun auf das Objekt xy aus Anwendung 2 zugreifen können.
    Weiß jemand, wie ich das machen kann ?

    Heidrun

  • #2
    Hallo,

    wenn beide Anwendungen .net sind dann kann eine Anwendung auf die andere verweisen und auf die (öffentlichen) Eigenschaften der Klassen zugreifen.

    D.h. füge der Anwendung1 einen Verweis auf Anwendung2 hinzu und erstelle eine Objekt der Klasse welche xyz als Eigenschaft hat. Greife auf diese Eigenschaft zu.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Danke für deine Antwort.
      Das mit dem Verweis funktioniert so bei mir nicht.
      Alles vb.net.

      In meiner Sub Main werden insgesamt 3 Anwendungen über Command unterschieden.

      Anwendung 1 und Anwendung 2 sind zwei davon.
      Das Objekt auf das ich zugreifen will, wird nur gefühlt, wenn Command für Anwendung 2 vorliegt.
      Deshalb habe ich wenn Command für Anwendung 1 vorliegt über Prozess Start die Exe mit dem Startparameter für Anwendung 2 eingefügt.
      Nur wie ich nun auf das Objekt zugreifen kann, weiß ich nicht.

      Heidrun

      Comment


      • #4
        Das mit dem Verweis funktioniert so bei mir nicht.
        Warum?

        Nur wie ich nun auf das Objekt zugreifen kann, weiß ich nicht.
        Siehe obige Antwort

        Deshalb habe ich wenn Command für Anwendung 1 vorliegt über Prozess Start die Exe mit dem Startparameter für Anwendung 2 eingefügt.
        Anwendung2 ist eine Assembly in Form einer EXE - sie kann aber wie jede andere Assembly per Verweis eingebunden werden und die (öffentlichen) Member vewendet werden. Somit kann die Anwendung2 auch durch das Aufrufen der Main-Methode von Anwendung1 gestartet werden und in Folge auf die Eigenschaft welche das xyz hat zugegriffen werden. Der Umweg über Process ist hier nicht nötig.


        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Originally posted by gfoidl View Post
          Warum?
          Weil ich dann lauter Fehlermeldungen erhalte, weil Variablen dann doppelt deklariert wären und nicht mehr eindeutig sind.




          Anwendung2 ist eine Assembly in Form einer EXE - sie kann aber wie jede andere Assembly per Verweis eingebunden werden und die (öffentlichen) Member vewendet werden. Somit kann die Anwendung2 auch durch das Aufrufen der Main-Methode von Anwendung1 gestartet werden und in Folge auf die Eigenschaft welche das xyz hat zugegriffen werden. Der Umweg über Process ist hier nicht nötig.
          Die Member sind alle mit dim in Anwendung 2 in der If-Abfrage auf den Command Parameter deklariert. Das Objekt xy wird nur gefüllt, wenn der Command den Parameter 2 hat.

          Bei Parameter 3 soll er den Code für Anwendung 1 ausführen.
          Dort hatte ich das mit Process.
          Meine Sub Main ist in einem Modul und ich kann auch keinen Variable mit new auf Main deklarieren.

          Heidrun

          Comment


          • #6
            Weil ich dann lauter Fehlermeldungen erhalte,
            Welche?

            weil Variablen dann doppelt deklariert wären und nicht mehr eindeutig sind.
            Warum?

            Meine Sub Main ist in einem Modul und ich kann auch keinen Variable mit new auf Main deklarieren.
            Main ist eine Methode und die kann (logischerweise) nicht mit new instanziiert werden. Das Modul (die Klasse) jedoch schon (Zugriffsmodifizierer beachten).

            Die Member sind alle mit dim in Anwendung 2 in der If-Abfrage auf den Command Parameter deklariert. Das Objekt xy wird nur gefüllt, wenn der Command den Parameter 2 hat.

            Bei Parameter 3 soll er den Code für Anwendung 1 ausführen.
            Dort hatte ich das mit Process.


            Was soll den überhaupt erreicht werden. Diese Lösung mit den Prozessen und den Flags erscheint mir als sehr eigenartig

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Das ganze soll einen Druckauftrag speichern (If Command = "0" then ...)
              Das nächste Anwendung 2 soll Druckauftrag laden (If Command = "1" then ...

              Objekt xy = Druckauftrag mit Daten )

              Die Anwendung 1 soll Druckauftrag Daten später drucken momentan nur auf einer Form anzeigen.
              (If command = "2" then ...
              Verbindung zur Exe von Anwendung 2 und xy laden und dann daten auf Form anzeigen.

              Das schema habe ich so von meinem Chef vorgestetzt bekommen.

              Modul Main

              Sub Main

              If Command = "0" then ...

              elseif command = "1" then ...

              elseif command = "2" then ...

              endif

              end sub

              end modul

              Comment


              • #8
                Wenn die Definitionen der Klassen im selben Namespace liegen kann es durchaus vorkommen, dass etwas doppelt definiert ist.

                Comment


                • #9
                  Das schema habe ich so von meinem Chef vorgestetzt bekommen.
                  Kann der Chef auch erklären warum? Diese Vorgehensweise wurde vor vielen Jahren so gelöst, lange bevor es objekt orientierte Programmierung und noch länger bevor es .net gab

                  Um einen konstruktiven Lösungsvorschlag zu geben müsste ich allerdings wissen in welchem Umfeld der Druckauftrag verarbeitet werden soll.


                  mfG Gü
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment


                  • #10
                    Mein Chef hat den Vorschlag von nem anderen Kollegen bekommen.
                    Alles in eine Projektdatei und über die verschiedenen Parameter zu starten ...

                    Der Druckauftrag soll später mal an ein Formulargenerator übergeben werden, der mit den Daten ein Formular (z.B ein Rechnungsformular) füllt und dann an einen Drucker weiterleitet und ausgedruckt wird.

                    Der erste Teil (wo der Druckauftrag gespeichert wird, soll auf einem Client laufen).

                    Der zweite Teil soll auf einem Server laufen, der nur für den Druck da ist und in einer Datenbank nachschaut, ob Druckaufträge da sind und die lädt.

                    Der dritte Teil soll die Daten von dem Server bekommen und läuft wieder wo anders und soll eben ein Formular mit den Daten füllen und dann an den Drucker weiterleiten.

                    Heidrun

                    Comment


                    • #11
                      Originally posted by gfoidl View Post
                      Kann der Chef auch erklären warum? Diese Vorgehensweise wurde vor vielen Jahren so gelöst, lange bevor es objekt orientierte Programmierung und noch länger bevor es .net gab

                      Um einen konstruktiven Lösungsvorschlag zu geben müsste ich allerdings wissen in welchem Umfeld der Druckauftrag verarbeitet werden soll.


                      mfG Gü
                      Tja... mein Chef meint auch dass Tests überflüssig sind und prozedurale Programmierung toll ist -.-

                      Comment


                      • #12
                        Ihr könnt ja dem Chef sagen er soll in einem Englischwörterbuch nachschlagen was Chef bedeutet und dann die übersetzte Tätigkeit ausüben wenn er sich nicht mit den Möglichkeiten von .net und generell der OOP anfreunden kann


                        mfG Gü
                        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                        Comment


                        • #13
                          Das Problem dabei ist nur, er ist zwar mein Chef, aber er ist gleichzeitig auch Programmierer. Der Hauptchef (sein Chef und auch unser Chef) ist reiner Kaufmann und der sitzt über 400 km weit weg von uns.

                          Heidrun

                          Comment


                          • #14
                            Hallo Heidrun,

                            hab mir alles noch mal durchgelesen, aber ich werden nicht schlau aus dem was erreicht werden soll.

                            Kann es sein dass Anwendung1 = Anwendung2 und die Ausführung durch die Parameter unterschieden wird. Dies scheint nämlich so denn in jeder "Anwendung" werden Fälle unterschieden und alle haben die gleiche Sub-Main.

                            Allerdings liese sich das leichter lösen wenn
                            Originally posted by gfoidl
                            Was soll den überhaupt erreicht werden.
                            nachgekommen worden wäre. Und dabe wäre auch wichtig zu definieren was unter "Druckauftrag" verstanden wird.

                            Aber ich glaube ich kann mir (heute) vorstellen um was es geht. Daher mein Vorschlag der sich auf folgendes Szenario bezieht:
                            • es gibt einen zentralen Druckserver
                            • verschieden Client erstellen Druckaufträge (zB Arbeitsaufträge, Bestelleingänge, ...) welche vom Druckserver gedruckt werden sollen
                            • als Puffer (Warteschlange) für die Druckaufträge wird eine Datenbank verwendet


                            Der erste Teil (wo der Druckauftrag gespeichert wird, soll auf einem Client laufen).
                            Die Client-Anwendung läut auf dem Client und erstellt ein Datenobjekt das alle Informationen zum späteren Drucken beinhalten. Dieses Datenobjekt wird in die Datenbank gespeichert - d.h. in der Datenbank wird ein Druckauftrag angelegt.

                            Der zweite Teil soll auf einem Server laufen, der nur für den Druck da ist und in einer Datenbank nachschaut, ob Druckaufträge da sind und die lädt.
                            Auf dem Druckserver der für das Drucken der Aufträge zuständig ist wird das Programm periodisch (mit dem Task-Scheduler von Windows) getartet und dieses Programm zuerst prüft ob neue Aufträge vorhanden sind. Wenn nicht kann das Programm wieder beendet werden. Falls ja so werden die Aufträge der Reihe nach gedruckt und die Druckaufträge aus dem Puffer (der Datenbank) entfertn oder eventuell zur Archivierung in die entsprechende Tabelle der Datenbank verschoben.

                            Der dritte Teil soll die Daten von dem Server bekommen und läuft wieder wo anders und soll eben ein Formular mit den Daten füllen und dann an den Drucker weiterleiten.
                            Diese Aufgabe wird auch von der 2. Anwendung (die auf dem Druckserver läuft) erlegit. Dazu werden die gespeicherten Datenobjekte an den Berichtsgenerator weitergereicht der die Daten mit der Berichtsvorlage rendert und dann druckt.

                            Die beschriebene Anwendung auf dem Druckserver existiert bereits weitestgehend mit zB SQL Reporting Services. Diese sind genau für so was gedacht. Somti muss nur die Anwendung auf dem Client erstellt werden, der Rest ist Erstellung der Datenbank, des Berichts und entsprechende Konfiguration des Berichtsservers.


                            mfG Gü
                            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                            Comment


                            • #15
                              Kann es sein dass Anwendung1 = Anwendung2 und die Ausführung durch die Parameter unterschieden wird. Dies scheint nämlich so denn in jeder "Anwendung" werden Fälle unterschieden und alle haben die gleiche Sub-Main.
                              Nein nicht ganz, da jede Anwendung später auf einem anderen Gerät läuft.
                              Anwendung 2 (Drucken bzw. Command = 2) soll nur die Daten erhalten, die Anwendung 1(Laden, wenn Druckauftrag vorhanden, d.h. Bearbeitet = false in der DB) geladen hat.
                              Alle haben die gleiche Sub-main, weil alle Klassen in einem Projekt sind und über die Startparameter unterschiedliche Aufgaben haben und nur diese ausführen.
                              So kann und soll später auf Client, Druckserver und anderm Gerät für die Erstellung der Berichte die gleiche Exe laufen, die über die Startparameter das gewünschte ausführt.

                              Aber ich glaube ich kann mir (heute) vorstellen um was es geht. Daher mein Vorschlag der sich auf folgendes Szenario bezieht:
                              • es gibt einen zentralen Druckserver
                              • verschieden Client erstellen Druckaufträge (zB Arbeitsaufträge, Bestelleingänge, ...) welche vom Druckserver gedruckt werden sollen
                              • als Puffer (Warteschlange) für die Druckaufträge wird eine Datenbank verwendet



                              Die Client-Anwendung läut auf dem Client und erstellt ein Datenobjekt das alle Informationen zum späteren Drucken beinhalten. Dieses Datenobjekt wird in die Datenbank gespeichert - d.h. in der Datenbank wird ein Druckauftrag angelegt.
                              Genau der Client sagt z.B in der Client Anwendung er will einer Rechnung drucken von Nummer 1 bis 10. (wären dann also 10 Rechnungen), er bestimmt den Drucker etc.

                              Dies wird in einer Datenbank gespeichert.
                              Dies erledigt der Teil mit Command = 0


                              Auf dem Druckserver der für das Drucken der Aufträge zuständig ist wird das Programm periodisch (mit dem Task-Scheduler von Windows) getartet und dieses Programm zuerst prüft ob neue Aufträge vorhanden sind. Wenn nicht kann das Programm wieder beendet werden. Falls ja so werden die Aufträge der Reihe nach gedruckt und die Druckaufträge aus dem Puffer (der Datenbank) entfertn oder eventuell zur Archivierung in die entsprechende Tabelle der Datenbank verschoben.
                              Nein nicht so ganz.
                              Über Command = 1 wird eine Klasse aufgerufen, die als Warteschlange fungiert.
                              Diese schaut über einen Timer in der Datenbank nach, ob neue Aufträge vorhanden sind und wenn ja, lädt diese in ein Objekt xy.
                              xy ist ein Objekt der Klasse Druckauftrag.
                              In der Klasse Druckauftrag sind die Funktionen für Speichern, Laden der daten eines Druckauftrages.
                              Dazu gehören :
                              Dokumenttyp, Parameter, Nummer(z.B. Rechnungsnummer), BeginnDruckDatum, BeginnDruckUhrzeit, Bearbeitet(Boolean), EndDruckDatum, EndDruckUhrzeit

                              Diese Aufgabe wird auch von der 2. Anwendung (die auf dem Druckserver läuft) erlegit. Dazu werden die gespeicherten Datenobjekte an den Berichtsgenerator weitergereicht der die Daten mit der Berichtsvorlage rendert und dann druckt.
                              Die Anwendung soll auf einem anderen Server laufen, nicht auf dem, wo die Anwendung, die Warteschleife quasi beinhaltet läuft.
                              Deswegen 3 verschiedenen Startparameter.
                              Für die 3 Programme (0 Speichern, 1 Laden und 2 Drucken).
                              In der Anwendung fürs Drucken ist der Prozess beinhaltet, der auf die Exe der Anwendung Laden verweist und diese startet.
                              Nun müsste ich eben nur noch auf die Daten, die in der Exe geladen werden zugreifen können.

                              Dachte mir heute früh, dass dies vielleicht über StandardOutput funktioniert.
                              Aber bin noch zu keinem Erfolg gekommen.

                              Heidrun

                              Comment

                              Working...
                              X