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
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
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
Habe jetzt mal noch nach Enable ein myTimer.Start() eingefügt. Hat aber nix gebracht
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
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.
Irgendwie hatte ich das schon vermutet. Nur das mit der MessageBox hatte mich dann komplett verwirrt.
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
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.
ich hab's jetzt so realisiert, aberso richtig wills noch nicht. Ich glaube, das wird noch ein langer Weg ;-) Gruß, Alex
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.