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!!!
Hallo Larsen,
und ich schiebe den dann mal noch nach
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)
mfg
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!!!
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!!!
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!!!
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
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.
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!!!
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
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!!!