timer in ereignis starten c#

Gast #4677334
Lesenswert?

Hallo,
gibt es einen Grund, weshalb sich ein Timer hier nicht starten läßt?

 //empfangene Daten sammeln
 private void serialPort1_DataReceived(object sender, 
serialDataReceivedEventArgs e)
{
 timer2.Enabled= true;
 addToTextBox("daten empfangen\r\n");
}

//Timer2 Auswertung
private void timer2_Tick(object sender, EventArgs e)
{
 timer2.Enabled= false;
 addToTextBox("Timer2\r\n");
}

Von anderen Stellen im Programm gestartet, läuft der Timer wie erwartet.
Gast #4677406
Lesenswert?

Danke :)
selbst wenn man per Hand einen neuen Timer anlegt funktioniert es nicht.

        //empfangene Daten        ----- DataReceived ----
        private void serialPort1_DataReceived(object sender, 
SerialDataReceivedEventArgs e)
        {
         //if (timer2.Enabled== false)
            Timer timerDR = new Timer();
            timerDR.Interval = 100;
            timerDR.Tick += new EventHandler(timerDR_Tick);
            timerDR.Start();

          //timer2.Enabled= true;
          //timer2.Start();
          dataEmpfCnt++;
         addToTextBox(String.Format("daten empfangen 
{0}\r\n",dataEmpfCnt));
        }
Gast #4677424
Lesenswert?

Holger74 schrieb:
> Soll der Thread im Data_Received-Ereignis gestartet werden?

nein, vergiss den Event.

Starte eine extra Methode als Thread.
1
void Read() 
2
{
3
    while( true ) {
4
        Serial.Read ....
5
        //verarbeite daten
6
    }
7
}
8

9
Thread t = new Thread( Read );
10
t.Start();

(nur schnellt getippt, nicht getestet!)
Gast #4677581
Lesenswert?

Holger74 schrieb:

> selbst wenn man per Hand einen neuen Timer anlegt funktioniert es nicht.

Weil dem Timer scheissegal ist, auf welche Art er erzeugt wird. Der 
springende Punkt ist: er funktioniert eben nur im GUI-Thread der 
Anwendung.

Wenn du einen Timer willst, der unabhängig vom GUI funktioniert, darfst 
du nicht den aus System.Windows.Forms nehmen, den du derzeit verwendest. 
Statt dessen z.B. System.Threading.Timer. Der wird allerdings ganz 
anders benutzt als der, den du kennst. Und natürlich lauft auch dessen 
Event im Kontext eines Nicht-GUI-Threads ab, du kannst also nicht 
einfach in dessen Eventhandler irgendwas am GUI machen.

Die Alternative ist, den Eventhandler des SerialPort mit dem GUI-Thread 
zu synchronisieren, dann kannst du ganz normal mit einem "normalen" 
Timer interagieren. Dazu bietet System.Windows.Forms.Form die netten 
Methoden InvokeRequired, und Invoke bzw. BeginInvoke an.
#4677598
Lesenswert?

c-hater schrieb:
> Und natürlich lauft auch dessen
> Event im Kontext eines Nicht-GUI-Threads ab, du kannst also nicht
> einfach in dessen Eventhandler irgendwas am GUI machen.

Das sollte aber nicht das Problem sein - dafür gibt es die BeginInvoke 
Methode.

Man sollte aber nie vergessen, dass der GUI Thread einfach ein eigener 
Thread ist, und der prinzipiell IMMER sehr allergisch darauf reagiert, 
wenn dort ein threadübergreifender Zugriff stattfindet. Es gibt da 
leider sehr oft die Konstellation, dass es 1000x geht, und beim 1001x 
dann nicht.
Gast #4677893
Lesenswert?

1
void Read() 
2
{
3
    while( true ) {
4
        Serial.Read ....
5
        //verarbeite daten
6
    }
7
}
8

9
Thread t = new Thread( Read );
10
t.Start();

Der Empfang der seriellen Daten ist schon in einem eignen Thread, wieso 
dann noch ein Thread darüber.

Beispiel für Invoke in meinem Beispielprogramm hier:

Beitrag "Visual Studio C# Serielle Daten anzeigen /verstehe befehle nicht"

In der SerialPortKlasse besitzt schon einen Transmit and Receive Timeout 
timer. Magst Du diesen nicht benutzen?
Gast #4677905
Lesenswert?

Thorsten schrieb:
> Der Empfang der seriellen Daten ist schon in einem eignen Thread, wieso
> dann noch ein Thread darüber.

nur wenn man die Events verwende.

> In der SerialPortKlasse besitzt schon einen Transmit and Receive Timeout
> timer. Magst Du diesen nicht benutzen?
genau das soll er ja machen, dafür muss er ja das Read machen, sonnst 
kommt es zu keinem timeout. Event macht das keinen sinn, weil man dort 
nur die Daten abrufen sollte, die vorhanden sind. Damit kommt aber kein 
Timeout mehr.

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