Autor Beitrag
C#Newbie
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 23.06.19 18:50 
Hey Leute,

ich möchte in meinen Programm (WindowsForms-Anwendung) zyklisch in zwei fest definierten unterschiedlichen Intervallen Daten aus 2 SPS-Steuerungen auslesen und dieses dann in einer Form visualisieren. Dazu bietet es sich ja an, zwei Timer zu verwenden. Was passiert nun, wenn sich der Aufruf der beiden Timer zeitlich überlagert....kann/sollte ich das verhindern? Was sollte ich eventuell noch bei der Progammierung der Timer beachten? Vielen Dank für eure schnelle Hilfe!


Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am So 23.06.2019 um 20:12
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 23.06.19 20:19 
Welche Intervallgrößen sollen es denn sein (Millisekunden oder eher Sekundenbereich)?
Beim WinForms-Timer würde der Code immer im UI-Thread laufen, d.h. bei zwei Timern also immer nacheinander. Daher wird wohl einer der beiden System-Timer dafür besser sein, aber wenn die Daten aus beiden SPS-Steuerungen dann wieder in einer gemeinsamen Datenbasis zur Visualisierung landen sollen, so mußt du ja sowieso eine Synchronisation einbauen.

Für diesen Beitrag haben gedankt: C#Newbie
C#Newbie Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 23.06.19 20:55 
Im Millisekundenbereich. System-Timer okay....also wahrscheinlich die aus dem Namespace "System.Timers" Wie kann ich die beiden Timer synchronisieren....mit der "Timer.SynchronizingObject Property" nicht zufällig? Wie meinst du das mit dem Code der UI Thread bei zwei Timern immer nacheinander läuft? Nochmals Vielen Dank!!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 23.06.19 22:09 
Ich meine, daß es dann kein Multithreading gibt (wenn also eine Timer-Methode mal mehr Zeit für die Ausführung benötigt, so muß der andere Timer bzw. die ganze UI dann warten).
Und mit Synchronisierung meine ich eher z.B. mittels des Schlüsselworts lock bzw. eine der Datencontainer aus dem System.Collections.Concurrent-Namensbereich, s.a. Threadsichere Auflistungen.

Sollen denn erst Daten gesammelt werden und danach dann komplett angezeigt oder aber soll es eine Echtzeit-Anzeige werden (weil dann benötigst du ja noch eine weitere Synchonrisierung zum UI-Control)?
C#Newbie Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 23.06.19 23:03 
Eine Echtzeitanzeige...wie wirkt sich das aus?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 24.06.19 07:37 
Ich meine damit nur, ob gleichzeitig während dem Sammeln der Daten auch schon diese angezeigt werden sollen? Du hast ja nur "... und dieses dann in einer Form visualisieren" geschrieben.
C#Newbie Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 24.06.19 22:45 
Genauso möchte ich es haben. Jetzt mal eine dumme Frage...wie programmiere ich den Datenausatausch zwischen den beiden Timer, welche im Main-Teil aufgerufen werden und der Form zum Darstellen? Für Code wär ich sehr dankbar. Vielen Dank für schnelle Hilfe!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 25.06.19 08:24 
Grob gesagt, solltest du das Datensammeln streng von der UI trennen, d.h. eigene Klasse dafür (in der Logikschicht) anlegen.
Und die UI sollte dann entweder selber mit einem Timer die aktuellen Daten (von der Logikschicht) holen oder aber (m.E. noch besser) per Ereignis (event) darüber informiert werden.