Autor Beitrag
sattler90
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 15.03.16 22:26 
Hallo Leute,

bin absoluter Neuling und habe ein Problem wo ich überhaupt nicht weiter komme. Ich komme aus dem SPS-Bereich und dort kann ich Ein- und Ausschaltverzögerungen programmieren. Was auch mein Problem ist...
Also folgendes: Ich habe einen Zähler, welcher bei Tastendruck um 1 hochzählt. Nach einer einstellbaren Schrittweite wird ein Alarm geworfen. D.h. Schrittweite ist 10 -> 9=kein Alarm; 10=Alarm; 11=keinAlarm...--> 20=Alarm; usw.
Das funktioniert auch so.
Ich möchte aber, dass sobalt der Alarm generiert wird, dass dieser für 3sec. stehen bleibt und dann wieder abschaltet. Egal ob ich jetzt auf 10 stehe oder schon weiter tippe auf 11,12,13,usw.

Programm per slepp() unterbrechen ist eher keine Lösung, da ich sonst meinen Zähler nicht weiterschalten kann in den 3 Sekunden... oder gibt es da eine Möglichkeit?!

Aktuell habe ich das Alarmbit welches gesetzt ist sobald ich meine Schrittweite erreicht habe. Über eine IF-Anweisung schalte ich dann meinen Ausgang am COM-Port.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if (xAlarmON)
{
    _serPort.DtrEnable = true;
}
else
{
    _serPort.DtrEnable = false;
}

[Sorry habs nicht gecheckt wie ich es als Quelltext einfüge]


Wäre euch über eine schnelle Antwort dankbar, da ich das ganze am Samstag benötige :-)

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 16.03.16 12:19 
Hallo und :welcome:!

Ich würde nicht mit Thread.Sleep arbeiten, sondern mit Task.Delay, weil dann die UI bedienbar bleibt (mal mit Label2 statt Tönen):

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
    private int counter = 0;
    private async void button1_Click(object sender, EventArgs e)
    {
      counter++;
      label1.Text = counter.ToString();

      if (counter % 10 == 0)
      {
        label2.Text = "an";
        await Task.Delay(3000);
        label2.Text = "aus";
      }      
    }

Die Funktionsweise von async und await wurde hier in letzter Zeit ein paar Mal thematisiert, da müsstest Du mal suchen. Im wesentlichen sorgt das Schlüsselwort "await" dafür, dass der Delay-Aufruf in einem separaten Thread läuft und den Hauptthread nicht "stört", danach wird in den Hauptthread zurückgekehrt und das Label wieder auf "aus" gesetzt.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".