Laden...

Wie kann ich aus einem Thread auf meine Form zugreifen?

Erstellt von Frokuss vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.638 Views
F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 6 Jahren
Wie kann ich aus einem Thread auf meine Form zugreifen?

Wunderschönen guten Tag,

ich habe da leider ein Verständnisproblem mit den Referenzen im Bezug auf Forms. Mein ursprünglicher gedanke war, dass Referenzen eigentlich so etwas wie Pointer sind. Aber dem scheint das wohl nicht zu sein?!?
Ich skizziere euch einfach mal meinen Fall:

ich habe:
1.) Main Methode: Erzeugt ein TrayIcon & mehrere Threads
2.) TrayIcon: Erzeugt Form
3.) Form: Erzeugt ein "neues Form"
4.) aus Thread muss ich auf "neues Form" zugreifen

Nun muss ich aber eigentlich auf das Form das in 3.) erzeugt wird aus einem Thread (aus 1.)) zugreifen. Daher war meine Überlegung einfach die Referenz durchzureichen. Aber irgendwie habe ist im Thread das Form immer null - obwohl mir das Form angezeigt wird.

Mein vorgehen war dabei folgendes:


ClassA{
  private Form objekt;
  ClassA(ref Form objekt){
    this.objekt = objekt;
  }

  Methode(){
    new ClassB(ref objekt);
  }
}

ClassB{
  private Form objekt;
  ClassB(ref Form objekt){
    this.objekt = objekt;
  }
}
//etc.

Dies muss aber anscheinend falsch sein. Daher würde ich mich freuen, wenn mir einer Ref erklären oder eine verständliche Lektüre liefern könnte. Oder eine Hilfestellung zur Problemlösung liefern kann.

Ich hoffe ich habe mein Problem verständich erklären können..

Besten Gruß Frokuss

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Frokuss,

ich bin mir unsicher, ob du hier nicht zwei Sachen mischst. "ref" und "aus Thread auf deine Form zugreifen". Deine vier Punkte erzählen was von Threads, aber der Codeschnipsel nicht.
Hilft dir
[FAQ] Kommunikation von 2 Forms

oder

[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

weiter?

Schau mal nach value types und reference types um deine Ref-Frage zu klären.

Ich hoffe das hilft etwa, wie gesagt: So ganz geschnallt habe ich deine Frage noch nicht 😉

Gruss

Coffeebean

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 6 Jahren

Hallo, vielen Dank für die beiden Links. Ich habe Sie mir noch nicht ganz angeguckt - wobei der zweite Link vielversprechend aussieht. Ich poste einfach mal etwas mehr Code - ist schon etwas größer das Projekt... Deswegen wollte ich verhindern zu viel zu posten...

Zugriff auf Attribute in ThreadSynchSendEmpf --> myWindowChat (Form bzw. MyForm:Form)

	internal sealed partial class Program : MyForm{
		private static Dictionary<string, MyForm> myWindows;
		private static FaceChat myWindowChat;

		[STAThread]
		private static void Main(string[] args){
			myThreads = new Dictionary<string, Thread>();
			myThreads.Add("Connection", new Thread(new ThreadStart(ThreadCheckConnection)));
			myThreads.Add("Synch", new Thread(new ThreadStart(ThreadSynchSendEmpf)));
			
			connectionTrys = 0;
			myThreads["Connection"].Start();
			//...
			//Hier habe ich die Referenz:
			myTrayIcon = new TrayIcon(freunde, freundesListe, lang, ref myWindows, ref myWindowChat);
			Application.Run(myTrayIcon);
			
			_beenden = true;
		}

		private static void ThreadSynchSendEmpf(){
			MyStream ms = new MyStream(myServer);
			Nachricht nachricht;

			while(!_beenden){
				if(myWindowChat != null){
					MessageBox.Show(myWindowChat.stackChat.Count.ToString());
					
					if(myWindowChat.stackChat.Count > 0){
						foreach(KeyValuePair<int, MyMessagePair> item in myWindowChat.stackChat){
							ms.Senden(CMD.Message, item.Value.id.ToString() + "#" + item.Value.txt);
							//win.stackChat.Remove(item.Key);
							break;
						}
					}
				}
				else
					MessageBox.Show("ist null...");
				Thread.Sleep(2000);
			}
		}
	}

TrayIcon.cs

	public class TrayIcon : Form
	{
		public TrayIcon(Dictionary<string, string> lang, ref Dictionary<string, MyForm> myWindows, ref FaceChat myWindowChat){
			//...
		}
		private void OnClickFreunde(object sender, EventArgs evt){
			bool check = FindFormByName(lang["TI_Freunde"]);
			if(!check){
				winFreunde = new FaceFreundesliste(lang["TI_Freunde"], freunde, freundeListe, lang, ref myWindows, ref myWindowChat);
				
				winFreunde.Show();
				fenster.Add((MyForm)winFreunde);
			}
			else
				MessageBox.Show("vorhanden..");
		}
	}

Wenn nötig kann ich noch mehr posten - dies soll nur erst einmal zeigen, wie ich das mit der Referenz gemacht habe. So gesehen dachte ich also, dass dike Referenz durchgereicht werden kann. Dies passiert so nun auch in der Klasse (Form) FaceFreundesliste die wiederum dann das Form FaceChat erzeugt, was das Zielobjekt ist und theoretisch dann vom Thread (s.o. vor dem ersten Code) genutzt werden sollte.

Aber wie gesagt... Die links noch nich angesehen - passiert jetzt.

Besten Gruß Frokuss

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 6 Jahren

Ich habe das Problem gelöst. Da waren ein paar Fehler meiner Seits. Nicht desto trotz hat mir der zweite Linke mit dem Invoke() trotzdem weitergeholfen. Auch wenn die Lektüre nicht so einfach war 😉

Besten Gruß und rechtherzlichen Dank(!) Frokuss