Laden...

Datenaustausch zwischen Forms

Erstellt von Larsen vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.580 Views
L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 17 Jahren
Datenaustausch zwischen Forms

Hallo,
ich habe 2 Forms in unterschiedlichen Threads laufen.
Wie ich Daten von UserFrm1 nach UserFrm2 innerhalb eines Threads bekomme, hab ich schon rausbekommen.
Meine beiden sollen aber in unterschiedlichen Threads laufen.

Gibt es die Möglichkeit einen Speicherbereich zu definieren, auf dem beide arbeiten können?

Form1 schreibend
Form2 lesend

In Form 2 will ich nur den Fortschritt einer Berechnung unter Form1 darstellen.

Oder macht man das ganz anders?

Gruß
Larsen

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!

738 Beiträge seit 2007
vor 17 Jahren

die typische Antwort:

Kommunikation von 2 Forms

2.223 Beiträge seit 2005
vor 17 Jahren

Hallo Larsen,

und ich schiebe den dann mal noch nach
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)

mfg

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 17 Jahren

Oha,
ich hab in letzter Zeit viel über Threads gelesen und die Antwort eher da gesucht.
Also geschickt vorbei gegoogelt 😦

DANKE
Larsen

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 17 Jahren

Hallo,
ich komme einfach nicht weiter, mein Problem ist bestimmt schon tausend mal besprochen worden
und eigentlich ganz einfach.
Ich hab auch ein ganz schlechtes Gewissen diesen Thread nochmals zu strapazieren, aber ich
hab im Moment keine Idee mehr und nicht wirklich viel Zeit mein Problem zu lösen.
So sieht das Stückchen Code zur Zeit aus!


IN_WAIT_Value=IN_WAIT_Cnt  = Convert.ToInt16(Step.GetDelay());
Ret = false;
Frm_ManCmd = new ManualCommand(Step);
Frm_ManCmd.Show();
while (Ret == false && IN_WAIT_Cnt > 0 && Frm_ManCmd.Visible==true )
      {
      	 // Während dieser Abarbeitung soll Frm_ManCmd den Fortschritt anzeigen
      	 // und wenn der User es möchte, soll er das Fenster schließen können. 
         Thread.Sleep(100);
         int Value = GetSchnittstellenValue();
         Ret = CheckValue(Value);
         IN_WAIT_Cnt -= 100;
         // diese Funktion habe ich zum Aktualisieren der Bar ins Frm_ManCmd eingefügt
         Frm_ManCmd.SetPBarValue((int)(((float)IN_WAIT_Cnt / (float)IN_WAIT_Value) * 100));
         Frm_ManCmd.Update();
       }
Frm_ManCmd.Dispose();

in der While Schleife bleibe ich, solange der IN_WAIT_Cnt > 0, meine Schnittstelle den falschen
Wert liefert oder Frm_ManCmd.Visible==false ist. Das dauert ne weile!
In dieser Zeit möchte ich einfach nur den IN_WAIT_Cnt als Statusanzeige im Frm_ManCmd anzeigen.
Leider kann ich bei diesem Vorgehen das Frm_ManCmd nicht bedienen (vorzeitig beenden) da es, wie
ich vermute, aus dem Thread aufgerufen wird, der eigentlich zu 100% ausgelastet ist.

Also habe ich probiert das Frm_ManCmd aus einem anderen Thread, den ich zuvor starte aufzurufen.
Das klappt auch, nur bekomme ich jetzt den Vortschritt nicht vernünftig rübergeschaufelt.

Ich glaub ich seh den Wald vor lauter...

Ich hab auch wirklich schon recht viel ausprobiert und nachgelesen aber die Verwirrung wächst
eigentlich nur.

Nochmals ganz vereinfacht gesagt:
Ich möchte aus einer Schleife (läuft etwas länger) auf einem UserFrm den Fortschritt darstellen und
dabei das UserFrm noch bedienbar haben (vorzeitig abbrechen).
Kann jemand meine Verwirrung auflösen???

Die ganzen Beschreibungen und Threads die ich gelesen habe konnte ich nicht richtig auf mein Problem beziehen, alles sehr informativ aber es hat halt immer irgendwo gehakt.

Wäre wirklich sehr dankbar für einen Tip.

Gruß
Larsen

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!

G
58 Beiträge seit 2007
vor 17 Jahren

Hast du dir mal Backgroundworker angeschaut?

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 17 Jahren

meinst du damit, dass einzelne threads in den Hintergrund gesetzt werden können?

Da hab ich zwischendurch was drüber gelesen, sehe aber keinen direkten Zusammenhang zu meinem Problem. Aber ich sehe im Moment auch nicht wirklich irgend etwas 😦

Gruß
Larsen

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!

T
512 Beiträge seit 2006
vor 17 Jahren

Es gibt ein paar Klassen, die direkt auf Threading in Windows.Forms ausgelegt sind.
Eine davon ist der BackgroundWorker.

e.f.q.

Aus Falschem folgt Beliebiges

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 17 Jahren

Hallo nochmal,
ich hab mich mittlerweile durch viele Threads zum Thema durchgewühlt, bin aber bei einigen Dingen nicht sicher, ob ich sie richtig verstehe.

Es ist immer die Rede davon, dass ein Zugriff auf ein Control nur aus dem GUI Thread passieren sollte. Was genau ist damit gemeint.

Mein Aufbau ist schematisch folgender:


classe Form1{
   bool Ende;
   
   buttonClick{
      Form2 Frm2 =new Frm2();
      Frm2.Show();
      neuerThread.Start();
      Ende=false;
      while(neuerThread.IsAlive && Ende=false){
           Ende=MachWas(); // hier wird was gemacht was zyklisch abgefragt werden soll
           Thread.Sleep(100);
      }

   }

   neuerThread{
      while(Form2.visible==true){
        Frm2.FunktionPBar();
        Thread.Sleep(100);
      }
      Ende=true;
   }

}


classe Form2{

//ProgressBar u.s.w.

  FunktionPBar(){
    Zugriff mit Control.Invoke u.s.w.
    PBar.Value=ValueXYZ;
  }
}

Ist das eine gängige Lösung (ich hab´s noch nicht wirklich funktionsfähig bekommen), oder macht man das total anders?
Ist mit GUI Thread der Zugriff innerhalb der Form Class gemeint oder der Thread in dem das Objekt angelegt wurde?
Ich habe hier zwei Probleme.

  1. Kann das überhaupt funktionieren.
  2. Bei der Ausführung ist mein Frm2 immer eingefrohren und nicht bedienbar.

Irgendwie habe ich das Gefühl, dass ich in eine total verkehrte Richtung denke und das der Grund ist dass ich nicht weiterkomme.

Gruß
Larsen

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!

J
3.331 Beiträge seit 2006
vor 17 Jahren

Hallo Larsen,

ich wage nicht, mich zu Deinem Code zu äußern, weil ich ihn so nicht verstehe (ich nehme auch an, dass Du nicht alle nötigen Code-Teile aufgeführt hast).

GUI Thread: Dabei handelt es sich um den Thread, in dem der Benutzer über den Bildschirm (GUI = Graphical User Interface) mit der Anwendung kommuniziert. Daraus folgt (zusammen mit der Main-Methode), dass es sich um den Thread handelt, zu dem das Hauptformular gehört. Jede Anwendung kann nur einen "Main-Thread" haben; alle weiteren Threads haben zwangsläufig keinen direkten Zugriff auf Controls.

Weitere Erläuterungen siehe in den FAQ, die sich mit der Kommunikation zwischen Formularen befassen.

Zur Ausführung in einem weiteren Thread empfehle ich die BackgroundWorker-Klasse. Das :rtfm: Beispiel dort ist sehr nützlich und beschreibt auch, wie Informationen an den GUI-Thread (z.B. eine ProgressBar) übergeben werden können. Es ist wahrscheinlich sinnvoll, dass Du damit nochmal anfängst.

Gruß Jürgen

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 17 Jahren

Hallo,
DANKE für die Antworten ich hab jetzt einen Weg gefunden, der funktional für mich OK ist.

In dem [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke) steckt wirklich alles was man braucht.
Es ist halt nur nicht so einfach das sofort zu verstehen.
Deshalb DANKE an alle die mir helfen wollten und geholfen haben.

Gruß
Larsen

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!