Forum: PC-Programmierung Thradsicherer button.performClick()


von Markus (Gast)


Lesenswert?

Hat mir jemand eine fertigen code in C#, denn ich


ich möchte einen button.performClick threadsicher aufrufen!


Danke

Markus

von Peter II (Gast)


Lesenswert?

Markus schrieb:
> ich möchte einen button.performClick threadsicher aufrufen!

und wo ist das Problem?
http://msdn.microsoft.com/de-de/library/ms173179%28v=vs.80%29.aspx

von Markus (Gast)


Lesenswert?

Ist das dann die Lösung wenn diese Fehlermeldung kommt?


Ungültiger threadübergreifender Vorgang: Der Zugriff auf das
Steuerelement menuStrip1 erfolgte von einem anderen Thread als dem
Thread, für den es erstellt wurde.

von Peter II (Gast)


Lesenswert?

Markus schrieb:
> Ungültiger threadübergreifender Vorgang: Der Zugriff auf das
> Steuerelement menuStrip1 erfolgte von einem anderen Thread als dem
> Thread, für den es erstellt wurde.

nein, das ist ein anderes Problem

dieses "Problem" wurde schon ausreichend gelöst

einfach mal bei googel "Ungültiger threadübergreifender Vorgang" suchen.

Dann wirst du dinge wie invoke finden.

von Markus (Gast)


Lesenswert?

ah ok

kann ich etwas mehr Hilfe bekommen, für mein Problem mit diesem Fehler?

Ungültiger threadübergreifender Vorgang: Der Zugriff auf das
> Steuerelement menuStrip1 erfolgte von einem anderen Thread als dem
> Thread, für den es erstellt wurde.

von Sven (Gast)


Lesenswert?

1
toolStripStatusLabel1.Text = i.ToString();

Das hier führt zu dem Fehler!

Wie kann ich den jetzt beseitigen?


Grüße

von Sven (Gast)


Lesenswert?

1
private void Function()
2
{
3
4
  System.Object lockThis = new System.Object();
5
6
                lock (lockThis)
7
                {
8
                    toolStripStatusLabel6.Text = i.ToString();
9
                }
10
}

So geht es aber nicht!

Kann mir jemand sagen, wieso es so nicht geht?

von Eddy C. (chrisi)


Lesenswert?

Dein Lock verhindert ja nur, dass genau dieser Codeteil von einem 
anderen Thread ausgeführt wird. Andere asynchone Manipulationen am 
Objekt werden nicht verhindert.

Die Änderung am Objekt muss vom Vordergrundthread geschehen. Und das 
erreicht man bequem mit Invoke.

von bluppdidupp (Gast)


Lesenswert?

Eine Möglichkeit wäre z.B.:
[/code]
// this. ist hierbei die Form oder ein anderes Objekt, das Invoke() 
unterstützt und im GUI-Thread erzeugt wurde.
this.Invoke((MethodInvoker)delegate
{
    // (X) Hierhin, den Code der im GUI-Thread ausgeführt werden soll
});
[/code]

Stark vereinfacht - Durch den Invoke wird:
1) der Code, der im GUI-Thread läuft an geeigneter Stelle unterbrochen
2) dann im GUI-Thread (X) ausgeführt
3) und dann läuft der normale Code im GUI-Thread weiter und ebenso der 
Thread, der Invoke aufgerufen hat.

von Jens P. (picler)


Lesenswert?

Wenn du es Quick & Dirty magst, dann versuche mal das hier:

Control.CheckForIllegalCrossThreadCalls = False

Ist allerdings nicht ganz ungefährlich, weshalb ich den Weg über invoke 
bevorzugen würde. Aber mal für ein kleines schnelles Programm geht es...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.