Laden...

Kommandozeilenparameter zur Programmlaufzeit übergeben/aktualisieren

Erstellt von blubb4321 vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.898 Views
B
blubb4321 Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren
Kommandozeilenparameter zur Programmlaufzeit übergeben/aktualisieren

Hallo,

ich habe hier ein Kommandozeilenprogramm, welches beim Start als Parameter einen oder mehrere Verzeichnispfade übergeben bekommt. Diese Pfade werden dann intern in einer Datenstruktur abgespeichert und anschliessend sequentiell hintereinander verarbeitet. Die Verarbeitung jedes Verzeichnisses nimmt etwas längere Zeit in Anspruch. Nachdem alle Verzeichnisse abgearbeitet wurden, beendet sich das Programm wieder. Soweit zum aktuellen Stand. 😃

Jetzt möchte ich zusätzlich ein Feature hinzufügen. Wenn das Programm ausgeführt wird, soll man die Möglichkeit haben, durch erneuten Start des Programms während der Laufzeit neue Pfade als Parameter zu den bisherigen Pfaden hinzuzufügen. Diese werden dann nur von der alten urspünglichen Instanz des Programms abgearbeitet. Es soll immer nur eine einzige Instanz des Programms laufen und die Pfade abarbeiten. Also nicht mehrere Programme parallel. Lediglich die Eingangsdaten sollen durch den erneuten Aufruf aktualisiert werden.

Weiss momentan nicht so recht wie ich dieses Problem lösen soll. Hat jemand sowas schonmal gemacht oder weiss jemand wie man sowas am Besten lösen kann?

Vielen Dank! 😃

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo blubb4321,

das was du da machen willst ist wohl so einfach nicht möglich.
Wenn ein Prozess mal läuft dann kannst du dem nicht ohne weiteres Werte neu übergeben.

Also dein Prozess startet und beginnt mit der Arbeit.
Dann startest du noch einen, dieser bemerkt dass es schon einen gibt, gibt diesen die Daten und killt sich.
Hier ist Beispiel wie man das implementieren kann: Single Instance Application Manager

Gruss
Michael

Gelöschter Account
vor 13 Jahren

Ich will anmerken das ich diesen Single Instance Manager Kram dämlich finde nach eingehender Prüfung. Da würde auch ein Mutex reichen.

2.223 Beiträge seit 2005
vor 13 Jahren

Hallo blubb4321,

wenn ich mich recht erinnere würde VB.Net genau dieses Feature von Haus aus anbieten, möglicherweise kannst Du in diese Richtung mal suchen.

Und möglicherweise von dort Dir Ideen besorgen.

Viele Grüße
Lars

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

so wie ich die Aufgabe verstehe würde ich 2 Programme daraus machen. Eines das als "Server" fungiert und die eigentliche Arbeit erledigt. Das andere Programm dient lediglich um die Arbeits-Queue des 1. Programms zu füllen.
Beide Programme können über eine beliebe Art der Interprozess-Kommunikation miteinander Daten austauschen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

1.820 Beiträge seit 2005
vor 13 Jahren

Hallo!

In Additional.NET befindet sich im Namespace TD.Additional.Runtime die Klasse InstanceManager, welches eine mögliche Lösung für dieses Problem bietet.

In der Hauptform müssen die folgenden statischen EventHandler verwendet werden:


            InstanceManager.ManagerInstance.NewInstanceCreated += ManagerInstance_NewInstanceCreated;
            InstanceManager.ManagerInstance.DataReceived += ManagerInstance_DataReceived;

Der Handler-Code sieht dann ungefähr so aus


        private void ManagerInstance_DataReceived(object sender, TD.Additional.Runtime.DataReceivedEventArgs e)
        {
            // Abarbeitung der in e.ToString() übergebenen Kommandozeile
        }

        private void ManagerInstance_NewInstanceCreated(object sender, EventArgs e)
        {
            BeginInvoke((MethodInvoker)delegate()
            {
                if (WindowState == FormWindowState.Minimized)
                    WindowState = FormWindowState.Normal;
                TopMost = true;
                TopMost = false;
                Activate();
            });
        }

ManagerInstance_NewInstanceCreated ist dabei optional und dient in diesem Beispiel nur dazu, die hauptinstanz wieder nach vorne zu holen.

In der Main-Methode muss dann noch

            if (InstanceManager.ManagerInstance.IsAlreadyRunning)
            {
                InstanceManager.ManagerInstance.Send(Environment.CommandLine);
                return;
            }

eingetragen werden. Damit wird überprüft, ob bereits eine Instanz läuft, und wenn ja, wird dieser die aktuelle Komanndozeile übergeben. Anschließend beendet sich die zusätzliche Instanz.

Leider habe ich z.Zt. noch keine brauchbare Doku für den aktuellen Stand, ich hoffe, in diesem Fall reicht dies erstmal.

Nobody is perfect. I'm sad, i'm not nobody 🙁

691 Beiträge seit 2007
vor 13 Jahren

Ich bin mir relativ sicher, einen Thread zu genau dem Thema hier mal gesehn zu haben. Benutze mal die Suchfunktion

mit freundlichen Grüßen,
Tomot

Projekte: www.gesellschaftsspieler-gesucht.de