Thread A stösst Änderung in Thread B an. Aber wie?

BeaTBoxX

Erfahrenes Mitglied
Hallo zusammen,

und weiter gehts mit einem neuen Problem :)

Ich habe (immernoch) eine Art FTP Client an dem ich programmiere.
Für den Komfort habe ich gewisse Funktionen in eigene Threads ausgelagert(Connect, Login, Upload usw usw)

Des weiteren habe ich ein paar Events erstellt um eine gewisse Syncronisation reinzubringen.

Mein Problem nun:

Beispielszenario:

Thread B verbindet sich grade mit dem FTP Server. Wenn fertig tritt ein Event auf , sinnngemäß "Connection established"

Diese Info möchte ich zurück an Thread A übermitteln (das is der hauptthread von dort wurde Thread B erschaffen)

Im Thread A möchte ich eine Statustextbox mit dieser Info updaten.

Nun meckerts aber, weil ich angeblich:

Cross-thread operation not valid: Control 'StatusTextbox' accessed from a thread other than the thread it was created on.

Kann mir bitte wer sagen, wie man sowas auf elegantem Wege macht?

Danke!

Gruß
Frank
 
Hi,

Invoke ist das Stichwort, wonach du suchst.
Über Delegates kannst du Thread-übergreifend kommunizieren.

Beispiele dazu findest du in der MSDN


Sorry, hab nicht viel Zeit, aber jetzt weißt du, wonach du suchen musst.
 
Um Domain oder Context übergreifend arbeiten zu können würde sich auch die Remoting Technologie anbieten.
 
Zuletzt bearbeitet:
Re: AW: Thread A stösst Änderung in Thread B an. Aber wie?

Um *Domain übergreifend arbeiten zu können bietet sich auch die Remoting Technologie an.
Ich glaub Du hast grad das Thema verfehlt. *g*
Es geht um Threads und nicht um Domains.

@ThreadStarter: Schau dich mal in dem folgenden Thema um.
[post=1337449]AW: Probleme beim neuzeichnen von pictureBox - Post[/post] (Beispielprogramm)
Darin findest ein Beispiel mittels Delegates ereignissgesteuert mit unterschiedlichen Threads zu kommunizieren.
Definier einen Delegate danach ein Event mit dem Deleagte als Handler und schon hast was Du brauchst.

In diesen Thread findest alles weitere zum Thema und Techniken merere Threads zu verwalten.
Musst Dich aber durchklicken um an alle Infos zu kommen. ;)
[thread=210935]Thread Hilfe, wie beenden? - Thread[/thread]
 
Habe den Post vor Deiner Antwort editiert cosmo.
Ein Thread bildet meines Wissens nach einen eigenen, geschlossenen Context. Man kann also von keinem Thread aus auf Variablen eines anderen Threads zugreifen.

Und für genau das Prob. war meine Lösung gedacht.
Falls es trotzdem eine Verfehlung des Themas is oder meine Antwort einfach falsch, dann bitte um Entschuldigung :p
 
Zuletzt bearbeitet:
Naja, ich weiss immer noch nicht was Remoting damit zu tun hätte. ;)

Mann kann sehr wohl auf Variablen in anderen Threads zugreifen.
Nur sieht es bei Controls schlecht aus, da sie ihrer visuellen Beschaffenheit wegen
nur von einem Thread verändert werden dürfen, damit das Eventhandling nicht durcheinander kommt
und auch keine Deathlocks enstehen.

Bei normalen Objekten kann es auch dazu kommen,
sofern 2 Objekte geichzeitig darauf zugreifen. Weiterhin kann es auch auch zu Inkonsistenzen der Daten kommen...
Um dem vorzubeugen hat man aber ein paar sehr mächtige Werkzeuge zu Verfügung.
  • Das volatile Schlüsselwort, welches einen synchronisierten Zugriff lediglich für eine einzelnes Objekt ermöglicht.
    Dieses Schlüsselwort kann zB in einer Singleton-Implemenation verwendet werden.
C#:
static volatile MainForm mainForm;
static object syncRoot = new object();

public static MainForm GetInstance {
	get {
		if ( !InstanceExists ){
			lock ( syncRoot ){
				mainForm = new MainForm();
			}
		}
		return mainForm;
	}
}
  • Für Codeanbschitte die Monitor.Enter & Monitor.Exit Methoden.
C#:
Monitor.Enter( syncRootObj );
        // synchronized access goes here
Monitor.Exit( syncRootObj );
Equivalent dazu das lock Schlüsselwort
C#:
lock ( syncRootObj ) {
        // synchronized access goes here
}
  • Um ganze ganze Methoden zu Synchronisieren hat man sogar das Attribut MethodImplAttribute zu Verfügung.
C#:
[MethodImpl(MethodImplOptions.Synchronized)
void SynchronizedMethod()
{
        // synchronized access goes here
}
 
Hm ich halte besser meine Klappe wenn ich mir bei meinen Antworten nicht mal selbst sicher bin :D

Naja, bin selber erst Anfänger und bei weitem nicht so professionell unterwegs wie du :(

Sorry für den sinnlos Post.

PS: Keine Sorge, das soll kein "kindisch-eingeschnapptes Verhalten" sein, sondern die Realität...
 
NP. Dein Posting war lediglich ein Ansporn das jetzt mal genauer zu erkären. :)
Ich hab grad angefangen ein Tutorial dazu zu schreiben,
darin werde ich auch mit Beispielen erläutern,
wie man thread-übergeifend auf Controls und deren Eigenschaften zugreifen kann,
was ja in meinem Posting noch gefehlt hat und man sich schlecht als Anfänger
aus den von mir weiter oben geposteten Links entnehmen kann, wie ich grad fest gestellt hab.

Werde dann den Link hier posten, ok. :)
 
[ :offtopic: ]
Sag mal cosmo, wieviel Zeit hast Du eigentlich?
Den ganzen Tag hier im Forum und nebenbei noch Tutorials schreiben *gg*
[/ :offtopic: ]

Eben das meinte ich mit meiner Aussage, ich weiß einfach noch zu wenig um es auch wirklich begründen zu können.
Habe nur das weiter gegeben was mit erklärt wurde.
Eben das Remoting u.a. dazu gut ist, um beispielsweise AppDomain übergreifend arbeiten zu können. Und angeblich hat ein Thread eben auch eine eigene gültigkeits Domain. Aber naja, konkrete Beispiele dazu kann ich nicht liefern, da ich mich selbst erst gerade in diese ganze Thematik einarbeite...

Nunja... was solls ... Selbstmitleid hilft nicht :D
Werd mal zurück an die Arbeit gehn.
 
Das Tut werde ich auch erst heute abend schreiben.

Du musst das was falsch verstanden haben, oder Dir hat irgend ein Berufsschullehrer
igend welchen Mist, wie so oft aus meiner Erfahrung, erzählt. :D

Gedult, Gedult. Das Tut kommt schon noch.

Und zum Thema Remoting:
[thread=251845]Remoting - Verständisproblem - Thread[/thread]
[thread=250715]Server Client Anwendung - Thread[/thread]
;-)
 

Neue Beiträge

Zurück