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 #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 #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