Forum: PC-Programmierung Timer startet nur nach MessageBox


von Alexander (Gast)


Angehängte Dateien:

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

von Dave (Gast)


Lesenswert?

Hi Alexander,

wenn ich deinen Code richtig gelesen habe startest du den Timer nicht du 
setzt in nur auf enabled.
Du must den timer auch mit myTimer.start() starten damit er losläuft.

Grüße Dave

von Alexander (Gast)


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

von Alexander (Gast)


Lesenswert?

Habe jetzt mal noch nach Enable ein myTimer.Start() eingefügt. Hat aber 
nix gebracht

von Dave (Gast)


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

von Mars (Gast)


Lesenswert?

timer.Enable = true und timer.Start() machen das gleiche.
Dein DataReceived-Event wird in einem anderen Thread ausgeführt. => Du 
musst den Timer per Control.Invoke aktivieren.

von Alexander (Gast)


Lesenswert?

Irgendwie hatte ich das schon vermutet. Nur das mit der MessageBox hatte 
mich dann komplett verwirrt.

von Dave (Gast)


Lesenswert?

Hi Alex,

hab nochmal kurz in der MSDN nachgelesen.
Die Funktion MessageBox.Show() ist Threadsicher.
Daher wird dann deine Enabled Änderung des Timers "übernommen"

Grüße Dave

von Alexander (Gast)


Lesenswert?

Bin mit C# noch nicht fit, weil neu. Hab zwar ein dickes Buch hier, aber 
das ist auch nicht vollständig und hat nicht so richtig den roten Faden.

Vielen Dank für die Mühe.

von Alexander (Gast)


Angehängte Dateien:

Lesenswert?

ich hab's jetzt so realisiert, aberso richtig wills noch nicht. Ich 
glaube, das wird noch ein langer Weg ;-)

Gruß, Alex

von Dave (Gast)


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

von Alexander (Gast)


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

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
Noch kein Account? Hier anmelden.