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
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.
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
Nur so der Vollständigkeit halber falls mal jemand das gleiche Problem hat -> Ich habs jetzt mit dem BackgroundWorker gelöst
> 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.
@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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.