Timer startet nur nach MessageBox

Gast #1404989
Lesenswert?

Hallo Community,

ich habe ein Problem mit meinem Programm, das ich mir nicht erklären 
kann.
Wie folgt:

ich empfange mit der RS232 eine bestimmte Zeichensequenz "START;" und 
werte diese aus. Daraufhin wird der Timer enabled. Nun, und das ist mir 
etwas zu hoch, läuft der Timer nur los (Timer_Tick Event tritt ein), 
wenn ich nach myTimer.Enabled = true; noch eine MessageBox ausgebe. 
Ansonsten sehe ich beim Debuggen zwar, dass myTimer.Enabled == true ist, 
aber das Timer Event tritt nicht ein. Kann das was mit den verschiedenen 
Threads von Timer und SerialPort zu tun haben. Wie gesagt, ich kann mir 
das nicht erklären.

Quellcode im Anhang.

Danke und Gruß, Alexander
Angehängte Dateien:
Gast #1404999
Lesenswert?

Hi Dave,

dann verstehe ich aber nicht, warum das geht mit der MessageBox. Wenn 
ich die wieder wegklicke, bleibt der Timer wieder stehn, habe ich eben 
noch festgestellt. Werde das aber gleich mal testen mit start/stop. 
Danke

Gruß, Alex
Gast #1405031
Lesenswert?

Hi Alexander,

sorry des mit dem SerialPort und async hab ich übersehen.. in der MSDN 
Library steht zu SerialPort DataReceived folgendes:
"Falls es erforderlich ist, Elemente im Haupt-Form oder im Haupt-Control 
zu ändern, senden Sie Änderungsanforderungen mithilfe von Invoke zurück, 
der den Vorgang dann auf dem richtigen Thread ausführt."
Bedeutet du musst das enable über invoke aufrufen, da du ja den Timer in 
der GUI hast.

Hier mal der link zur Hilfe in msdn:
http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.datareceived.aspx

Grüße Dave
Gast #1405146
Lesenswert?

Hi Alex,

ich sowas mal mit nem Progressbar gemacht in der Gui und nem seperaten 
thread.
//deklaration Delegat
IncrementProgressbarValue ProgressBarIncrement;
//hier der eigentliche aufruf
//pgbProgress ist ein control wie dein timer, bei dem rufst du invoke 
auf und übergibst ihm den delegaten
pgbProgress.Invoke(ProgressBarIncrement);

Grüße Dave
Gast #1405247
Lesenswert?

Hallo Dave,

ich hab noch 'ne kurze elegante Möglichkeit gefunden, falls es Dich 
interessiert:

Invoke(new Action(myTimer.Start));

Kurz und schmerzlos. Damit läuft's.

Danke für Deine Geduld.

Gruß, Alex

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