Forum: PC-Programmierung Vom Thread aus Button sperren


von Johann (Gast)


Lesenswert?

Hallo,

ich schreibe in C# ein kleines Programm. Dieses Programm soll 
ermöglichen, das wenn z.B. der Button "Senden "betätigt wird Daten über 
den Com-Port verschickt werden.
Damit die Oberfläche während des Sendevorgangs nicht blockiert wird 
werden
die Daten innerhalb eines Thread versendet.

 private void ThreadMain()
        {

            if((Thread.CurrentThread.ThreadState & ThreadState.Running) 
== ThreadState.Running)
            {
                if (serial.IsOpen)
                {
                    WriteHoldingRegisters(); //hier wird gesendet


                }
                else
                {
                    MessageBox.Show(serial.PortName + " Port ist nicht 
geöffnet! ");
                }


            }
        }

Dieser Thread wird durch den Button "Senden" erzeugt und gestartet.
Terminiert wird der Thread automatisch nach einem durch lauf.

Jetzt die Frage:
Wie kann ich den Button"Senden "aus dem laufenden Thread heraus 
deaktivieren. So das es man während der Thread läuft nicht nochmal
auf den Button"Senden " drücken kann.

Ich würde mich freuen wenn mir jemand mal ein paar Stichworte liefert
wie man das macht

von Albert .. (albert-k)


Lesenswert?

Hi
du könntest über ein Mutex Arbeiten. Und zwar packst du ganz am Anfang 
deiner Senden routine das Mutex rein und frägst es ab. Wenn es gesperrt 
ist wird der Thread an dieser Stelle Blockieren und nicht senden.
ist das Mutex frei startet deine Funktion innerhalb der du das Mutex 
setzt. Am Ende der Funktion gibst du das Mutex wieder frei.

von kiar (Gast)


Lesenswert?

Johann schrieb:
> Ich würde mich freuen wenn mir jemand mal ein paar Stichworte liefert
> wie man das macht

moin,

hier http://www.mycsharp.de/wbb2/board.php?boardid=70 findest Du alles 
was du brauchst.

raik

von Randy N. (huskynet)


Lesenswert?

1
button1.Invoke(delegate() {
2
    button1.Enabled = false;
3
});

von Johann (Gast)


Lesenswert?

Nur so der Vollständigkeit halber falls mal jemand das gleiche
Problem hat -> Ich habs jetzt mit dem BackgroundWorker gelöst

von Randy N. (huskynet)


Lesenswert?

> Nur so der Vollständigkeit halber falls mal jemand das gleiche
> Problem hat -> Ich habs jetzt mit dem BackgroundWorker gelöst

Geht, aber wieso ignorierst du meine Variante? Die macht genau das, was 
du ursprünglich wolltest. Du kannst das Codestück aus einem beliebigen 
Thread heraus aufrufen und innerhalb des Delegates beliebige Dinge der 
Oberfläche (also alles, was im UI-Thread läuft) manipulieren.

von Johann (Gast)


Lesenswert?

@Randy N:
Ich hätte deine Variante ganz gerne umgesetzt bin ab daran gescheitert
den wenn ich das:

button1.Invoke(delegate() {
    button1.Enabled = false;
});

in den Thread schreibe ist der Button1 nicht sichtbar also der Thread 
befindet sich in einer anderen Klasse als der Button. Ist bestimmt ein 
Anfängerfehler den ich da gemacht hab . Muss ich bevor dieser Aufruf 
funktioniert ein Passendes Delegate deklarieren oder wie?

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

am einfachsten: der Button deaktiviert sich beim Anklicken selbst. Dann 
kann niemand mehr noch einmal die gleiche Funktion auslösen, bis er (von 
irgendwoher) wieder enabled wird. Probleme mit Zeitüberschneidungen gibt 
es dabei nicht, wenn Eingaben zügig bearbeitet werden; bei einem 
Programm, dass zeitweise Eingaben nicht bearbeitet, hilft das nicht.

Gruss Reinhard

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.