Sascha schrieb:
> ...nicht erst die einzelnen Anzeigeelemente per Invoke zu synchronisiern >
sondern direkt beim "ankommen" meiner Daten das ganze per invoke zu
> machen.
Üblicherweise macht man sowas aus dem empfangenden Thread heraus nicht
per Control.Invoke sondern über ein Event. Der Mechanismus ist der
gleiche, nur "hängt" das Event nicht an einem Control, sondern an der
Klasse des Datenmodells im Hintergrund. In Deinem Fall also die Klasse,
die die seriellen Daten empfängt. Der Code könnte in etwa aussehen wie
folgt:
1 | public delegate void HandleSerialDataCallback(int e, sSerDat SerDat);
|
2 |
|
3 | public class DataModel
|
4 | {
|
5 | public event HandleSerialDateCallback SerialDataAvailable;
|
6 |
|
7 | ...
|
8 |
|
9 | private void EmpfangeSerielleDaten()
|
10 | {
|
11 | ...
|
12 | int intData = ...
|
13 | sSerDat receivedData = ...
|
14 | if (SerialDataAvailable != null)
|
15 | SerialDataAvailable.Invoke(intData,receivedData);
|
16 | ...
|
17 | }
|
18 | }
|
Die GUI-Klasse registriert sich bei der Instanz von DataModel als
Konsument des Events:
1 | class Xyz
|
2 | {
|
3 | private DataModel model;
|
4 |
|
5 | public Xyz()
|
6 | {
|
7 | model = new DataModel();
|
8 | model.SerialDataAvailable += SerialDataAvailableHandler;
|
9 | }
|
10 |
|
11 | private void SerialDataAvailableHandler(int intData, sSerDat serDat)
|
12 | {
|
13 | ...
|
14 | // hier die Controls per Control.Invoke aktualisieren, da
|
15 | // die Methode im Call-Context des aufrufenden Threads auf-
|
16 | // gerufen wird (hier der Thread, der die Daten seriell empfängt).
|
17 | ...
|
18 | }
|
19 | }
|
Der Vorteil dieses Verfahrens ist die Entkopplung des Daten-Modells von
der GUI, da alle GUI-Components nur in der betreffenden GUi-Klasse
verwendet werden. Viel Erfolg!
Gruß
Markus