mikrocontroller.net

Forum: PC-Programmierung Timer startet nur nach MessageBox


Autor: Alexander (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander (Gast)
Datum:

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

Autor: Dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Grüße Dave

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie hatte ich das schon vermutet. Nur das mit der MessageBox hatte 
mich dann komplett verwirrt.

Autor: Dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander (Gast)
Datum:
Angehängte Dateien:

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

Gruß, Alex

Autor: Dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.