Vom Thread aus Button sperren

Gast #1673935
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
#1673942
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.
#1674543
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.
Gast #1675298
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?
Gast #1675353
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren