www.mikrocontroller.net

Forum: PC-Programmierung Vom Thread aus Button sperren


Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Albert ... (albert-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kiar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Randy N. (huskynet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
button1.Invoke(delegate() {
    button1.Enabled = false;
});

Autor: Johann (Gast)
Datum:

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

Autor: Randy N. (huskynet)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.