myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE
   » Gadget für Windows
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin

Ressourcen
» guide to C#
» openbook: Visual C#
» openbook: OO
» MSDN Webcasts
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » Wie kann ich aus einem Thread auf meine Form zugreifen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich aus einem Thread auf meine Form zugreifen?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 57


Frokuss ist offline

Wie kann ich aus einem Thread auf meine Form zugreifen?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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
17.11.2017 15:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Coffeebean Coffeebean ist männlich
myCSharp.de-Team

images/avatars/avatar-3295.gif


Dabei seit: 25.08.2011
Beiträge: 2.002
Entwicklungsumgebung: VS 2005-2017, VS Code
Herkunft: Deutschland/Schweiz


Coffeebean ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
17.11.2017 15:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 57

Themenstarter Thema begonnen von Frokuss

Frokuss ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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)

C#-Code:
    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

C#-Code:
    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
17.11.2017 16:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 57

Themenstarter Thema begonnen von Frokuss

Frokuss ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
17.11.2017 19:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2017 myCSharp.de-Team. Alle Rechte vorbehalten. 12.12.2017 07:25