Hilfe für eine C# Applikation

Gast #3145095
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?
Gast #3145308
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.
Gast #3145604
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 ?
Gast #3145608
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
Gast #3145620
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
Gast #3149264
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.
Gast #3149288
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 ?
Gast #3149660
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren