Hallo, ich habe mit Visual Studio eine C# Applikation erstellt, mit der ich via CAN größere Datenmengen an einen Mikrocontroller sende. Mit einem Timer werden die Daten nacheinander versendet.Bin mit der Vorgehensweise nicht so ganz überzeugt.Wie wird sowas professionell gelöst? Wird möglicherweise sowas mit Threads realisiert? Muss der Timer mit der GUI synchronisiert werden?
Deine Fragen sind etwas zu generisch um sie zu beantworten. Falls die CAN-Kommunikation blockierend ist, und die GUI währenddessen steht, solltest Du es tunlichst in einen eigenen Thread auslagern.
Die Timerfunktionalität sollte ich in einem eigenen Thread unterbringen?
Im folgenden poste ich mal die Timerimplementierung von meiner C# Applikation.
1 | System.Windows.Forms.Timer Timer; |
2 | |
3 | Timer = new System.Windows.Forms.Timer(); |
4 | |
5 | public ToolForm() |
6 | {
|
7 | InitializeComponent(); |
8 | |
9 | ...
|
10 | |
11 | Timer = new System.Windows.Forms.Timer(); |
12 | Timer.Interval = 5; |
13 | Timer.Tick += new EventHandler(TimerEvent); |
14 | Timer.Enabled = false; |
15 | |
16 | ...
|
17 | }
|
18 | |
19 | public void TimerEvent(object senden, EventArgs e) |
20 | {
|
21 | try
|
22 | {
|
23 | this.Invoke(new InvokeProc(OnTimer)); |
24 | }
|
25 | catch { }; |
26 | }
|
27 | |
28 | public void OnTimer() |
29 | {
|
30 | |
31 | }
|
Wie müsste bzw. wie kann man dies mit einem Thread lösen ?
Hallo Es ist grundsätzlich immer eine gute Idee, Aktionen in einen eigenen Thread auszulagern. Eine blockierte GUI sieht immer sch… aus. Aber nehm doch einfach das, eas dir C# anbietet. Ich nehme meist die Komponente "BackgroundWorker" für Datenbankabfragen und Sachen die halt länger brauchen könnten. Im Namespace "System.Threading" gibt es einen Timer, der deine Callback-Funktion in einen eigenen Thread ausführt. Die Microsoft MSDN ist hier dein Freund. MfG Sven
Hallo Sven, danke für deine Antwort. Soll ich nun einen Timer in einem Thread verwenden ? Was meinst du mit BackgroundWorker ?
Wenn du einen Timer und einen Worker-Thread brauchst, dann nehme halt den, den dir C# anbietet. Siehe den vorhergehenden Link... Ein BackgroundWorker kapselt dir das Ereignisbasierte asynchrone Entwurfsmuster. Hier gibt es was zu lesen. http://msdn.microsoft.com/de-de/library/wewwczdw(v=vs.80).aspx http://msdn.microsoft.com/de-de/library/system.componentmodel.backgroundworker.aspx Schaue dir die Beispiele an und ändere sie so, dass sie für deinen Fall passen. MfG Sven
Solange deine Timer-Prozedur schnell genug beendet wird, läuft auch das GUI flüssig. Den Timer in einen Thread zu packen ist auch einfach. Syncronisieren musst Du wenn du Steuerelemente schreibst die IsInvokeRequired haben sonst ruckelt das GUI.
Guten Morgen Hubert, danke für deine Hilfe. Was meinst du mit "IsInvokeRequired" ? Wenn ich einen Timer in einem Thread aufziehe, dann muss ich das ganze mit der GUI synchronisieren. Ist das damit gemeint ?
Die Eigenschaft ist InvokeRequired und gibt true zurück, falls sich das Steuerelement in einem anderem Thread als dem aufrufendem befindet. Es gibt aber in diesem Zusammenhang IsHandleCreated, das true sein sollte wenn InvokeRequired false liefert und das Steuerelement geschrieben werden soll. Den Timer-Thread musst Du mit Invoke synchronisieren um im GUI was auszugeben.
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.