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! 😃
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
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
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!"
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 🙁
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