Laufende Instanz fernsteuern

OliWan

Mitglied
Hi Coders!

Ich braucht dringend mal einen Tipp: :suspekt:

Ich habe ein WinForm gebaut, dass aus einem Verzeichnis Bilder lädt und
diese einzeln in einer PictureBox anzeigt. Hierzu gibt es ein Menu, um mit
dem angezeigtem Bild bestimmte Dinge zu machen, z.B. Speichern unter...

Das klappt alles soweit - nun aber meine Frage:

Es kommen unregelmäßig neue Bilder in dieses Verzeichnis und ich möchte
die Methode loadimages im aktiven Winform irgendwie von extern her
aufrufen. Geht das in C# überhaupt?

Hope for help
ObiWan
 
OliWan hat gesagt.:
Hi Coders!
Es kommen unregelmäßig neue Bilder in dieses Verzeichnis und ich möchte
die Methode loadimages im aktiven Winform irgendwie von extern her
aufrufen. Geht das in C# überhaupt?

Wieso öffnest du nicht einfach ein Thread der selbständig nach n-Sekunden
den Ordner checkt?
 
Schau dir mal unter den Komponenten den FileSystemWatcher an. Den kannst auf ein Verzeichnis legen und es wird ein Event ausgelöst, sobald sich etwas im Verzeichnis ändert, oder was hinzukommt, oder wie auch immer - ist einstellbar.

Das ist genau das was du brauchst.
 
Danke für die TIPPS !

Das mit dem Filewatcher ist schon OK - aber hier habe ich folgendes Problem:

Programm A bekommt Daten per USB und baut daraus eine Grafik.
Programm B zeigt die erstellten Grafiken an.

Dummerweise kommen ständig "Nachträge" zu schon vorhandenen Grafiken, also
Erweiterungen zu schon vorhandenen Graphen. Mein Programm A ist immer
abgebrochen, wenn Programm B gerade das Bild anzeigte, das es gerade updaten wollte.

:confused:

Deshalb habe ich eine Methode bebastelt, die nach dem Update die Grafiken in ein
TMP Verzeichnis kopiert. Auf dieses greife ich dann zu und zeige diese Tmpgrafiken an.

Kommen nun neue Updates, muß die Anzeige in Programm B auf "bilder werden geladen" gesetzt werden, die neuen Grafik müssen ins TMP Verzeichnis kopiert werden und dann
soll die aktuelle ImageListe bzw. das Bilder-Array neu gefüllt werden.


Nun hatte ich gedacht, dass ich diese Methode (sie heißt loadimages()) extner aufrufe, wenn das update abgeschlossen ist. Dabei soll keine neue Instanz meines WinForm aufgerufen werden, sondern die laufenden, wenn eine da ist, soll die Methode durchführen?!

Ich hoffe es ist klar geworden?! und vor allem hoffe ich, dass es hierfür einen Weg gibt.

Vieleicht bin ich vorher schon falsch abgebogen

Hope for help thx coders!
OliWan
(!)
 
Naja, du kannst ja die Assembly des Viewers per Reflection einbinden und so einfach steuern und halt die Anzeige entsprechend anpassen, stoppen, neu starten oder wie auch immer.

Wobei du das (meiner Ansicht nach) ein wenig kompliziert angehst.

Ich hätte hier eine Anwendung mit zwei Threads. Der eine Thread checkt USB, der andere Thread zeigt an. Dann hast du alles innerhalb einer Anwendung.
 
mmm OK - geht das auch im Winform?

Hier habe ich folgendes in der Main[]

Code:
static void Main()
		{
		  Process instance = RunningInstance();
		 if (instance == null)
				 {

			Application.Run(new WinForm());
			}else{
			HandleRunningInstance(instance);

			}
		}

		public static Process RunningInstance()
 {
 Process current = Process.GetCurrentProcess();
 Process[] processes = Process.GetProcessesByName (current.ProcessName);

 //Loop through the running processes in with the same name
 foreach (Process process in processes)
 {
 //Ignore the current process
 if (process.Id != current.Id)
 {
 //Make sure that the process is running from the exe file.
 if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") ==
 current.MainModule.FileName)
 {
 //Return the other process instance.
 return process;
 }
 }
 }

 //No other instance was found, return null.
 return null;
 }
public static void HandleRunningInstance(Process instance)
 {
 //Make sure the window is not minimized or maximized
 ShowWindowAsync (instance.MainWindowHandle , WS_SHOWNORMAL);

 //Set the real intance to foreground window
 SetForegroundWindow (instance.MainWindowHandle);


 }

 [DllImport("User32.dll")]
 private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
  [DllImport("User32.dll")] private static extern bool
 SetForegroundWindow(IntPtr hWnd);
 private const int WS_SHOWNORMAL = 1;

Nun hatte ich gehofft, dass man, nachdem man eine laufende Instanz gefunden hat, mit
z.b. process.loadimages(); diese Methode in dem laufendem Prozeß aufrufen kann.
:confused:
OliWan...
 
.... ich komm da irgendwie nicht weiter -
deshalb habe ich die Instanzprüfung aus dem WinForm rausgeworfen.

Bevor ich nun diese Form aufrufe, prüfe ich ob es schon einen Prozeß gibt der
bereits läuft:

Code:
 string RunningInstance()
 {
   String ergebnis ="no";
   System.Diagnostics.Process[] myProcesses;
   myProcesses =
	  System.Diagnostics.Process.GetProcessesByName("frontend");


   foreach (System.Diagnostics.Process instance in myProcesses)
   {
	  ergebnis="yes";
   }

 return ergebnis;
 }

-> Wenn ein yes zurück kommt will ich dann die Methode loadimages() in der laufenden Instanz aufrufen. :-(

Ich habe mich mit Invoke und delegat beschäftigt, aber ich steige da nich durch :(

Bitte gibt es jemanden, der weis ob das überhaupt geht und wenn ja wie?

Danke für eure Geduld
OliWan
 
Zurück