Forum: PC-Programmierung Hilfe für eine C# Applikation


von Tigger (Gast)


Lesenswert?

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?

von na klar (Gast)


Lesenswert?

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.

von Tigger (Gast)


Lesenswert?

Die Timerfunktionalität sollte ich in einem eigenen Thread unterbringen?

von Tigger (Gast)


Lesenswert?

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 ?

von Sven (Gast)


Lesenswert?

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

von Sven (Gast)


Lesenswert?

Hier vielleicht noch der Link...

http://msdn.microsoft.com/de-de/library/ms149618.aspx

MfG Sven

von Tigger (Gast)


Lesenswert?

Hallo Sven,

danke für deine Antwort. Soll ich nun einen Timer in einem Thread 
verwenden ? Was meinst du mit BackgroundWorker ?

von Sven (Gast)


Lesenswert?

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

von Hubert (Gast)


Lesenswert?

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.

von Tigger (Gast)


Lesenswert?

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 ?

von Hubert (Gast)


Lesenswert?

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