Autor |
Beitrag |
Christoph1972
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Sa 16.01.16 23:11
mkRE hat folgendes geschrieben : | Wird mit listen z.B. eine TextDatei gemeint? |
Nein damit ist ein Klasse mit einer generischen Liste gemeint.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| [Serializable] public class Measurement { public Measurement() { ListOfPoints = new List<PointValues>(); }
public string Name { get; set; } public DateTime Measurementdate { get; set; }
public List<PointValues> ListOfPoints { get; set; } }
[Serializable] public class PointValues { public int X { get; set; } public int Y { get; set; } } |
Serialisieren kann man das dann so:
Klasse die die De-/Serialisierung übernimmt.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| public class MySerializer { public static void Serialize(object myClass, string directory, string file) { if (!Directory.Exists(directory)) Directory.CreateDirectory(directory);
string fileabs = Path.Combine(directory, file);
using (FileStream myFileStream = new FileStream(fileabs, FileMode.Create)) { BinaryFormatter binFormatter = new BinaryFormatter(); binFormatter.Serialize(myFileStream, myClass); } }
public static object Deserialize(string file) { object oldObject = null;
if (File.Exists(file)) { using (FileStream myFileStream = new FileStream(file, FileMode.Open)) { BinaryFormatter binFormatter = new BinaryFormatter(); oldObject = binFormatter.Deserialize(myFileStream) as object; } } return oldObject; } } |
Speichern /laden:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| private void LoadSave() { Measurement m = new Measurement() { Name = "Messung1", Measurementdate = DateTime.Now };
for(int i = 0; i < 100; i++) { m.ListOfPoints.Add(new PointValues() { X = i, Y = i }); } MySerializer.Serialize(m, @"c:\Test", "Messung1.mes");
var oldMes = MySerializer.Deserialize(System.IO.Path.Combine(@"c:\Test", "Messung1.mes")); } |
Alternativ gibt es auch einen XML Serializer.
mkRE hat folgendes geschrieben : | Was wird genau mit auf Platte schreiben gemeint und welche Datei kann ich mir da vorstellen?
|
Damit ist gemeint, das man jeden oder jeden n Messpunkt gleich auf die Festplatte wegschreibt. Stellt sich nur die Frage, ob man mit einer unterbrochenen Messung was anfangen kann, oder wartet man mit dem speichern bis zum Ende vom Lauf? Das kannst nur Du wissen....
Für den Anfang kannst Du aber auch ruhig eine Tabelle verwenden, wenn dir das leichter fällt. Das wird auch sehr gut laufen. Ich verdiene mein Geld mit messen und spreche da aus Erfahrung Aber mein Vorschlag ist auch nicht so schwer, oder?
_________________ Gruß
Christoph
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Sa 16.01.16 23:20
Bitte nimm keine DataTable (Sorry Christoph )
Ja, es ist einfach und Du kannst im Prinzip alles rein werfen, aber das ist auch der größte Nachteil.
Du kannst alles rein werfen, wie das am Ende aus sieht und ob das, was Du rein wirfst, aich so richtig ist, erfärst Du erst irgendwann zur Laufzeit.
Besser wäre sowas:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| public class Measurement { public int Size { get; set; } public DateTime Timestamp { get; set; }
} |
Und die (beispielhafte) Nutzung:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var measurements = new List<Measurement>();
while (Measuring) { var measurement = new Measurement();
measurement.Size = GetSize(); measurement.Timestamp = DateTime.Now;
measurements.Add(measurement); }
Serialize(measurements); |
Da hast Du eine feste Struktur (Die Klasse Measurement) und der Compiler sagt dir, was nicht passt.
Das Speichern muss aber ohne bereits implementierte Read- und Write-Methode nicht kompliziert sein.
Der XmlSerializer macht das fast genauso einfach. Das "fast", weil das erst einmal implementiert werden muss:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| public static void Serialize<T>(string xmlFile, T obj) { var serializer = new XmlSerializer(typeof(T));
using (var fileStream = File.Create(xmlFile)) { serializer.Serialize(file, obj); } } public static T Deserialize<T>(string xmlFile) { var serializer = new XmlSerializer(typeof(T));
using (var fileStream = File.OpenRead(xmlFile)) { return (T)serializer.Deserialize(file); } } |
Diese Methoden irgendwo hin legen und aufrufen.
Solange die Objekte serialisierbar sind, ist damit Lesen und Speichern geklärt.
Und keine Sorge: Die Meispielklasse oben ist serialisierbar, solange die Properties öffentlich gelesen und geschrieben werden können und ein public Konstruktor ohne Parameter existiert.
Sowas wie ein Dictionary nicht, allerdings gibt es online ohne Ende Beispiele, wie man das nachliefern kann.
Das hat den Vorteil, dass es sehr einfach ist und Du hast nicht die Nachteile einer DataTable.
Ist es aber unbedingt von Bedeutung, dass im schlimmsten Fall zumindest ein Teil der Messwerte erhalten bleiben, dann hast Du da ein Problem.
So kann ich mir z.B. vorstellen, dass eine sehr lang andauernde Messung irgendwann einen Fehler hat und Du die komplette Messung neu starten musst, da die Ergebnisse erst nach der Messung gespeichert werden.
Ob das von Bedeutung ist, das musst Du wissen.
Wenn es von Bedeutung ist, dann musst Du selber manuell schreiben und dir ein eigenes Vormat (z.B. durch Trennzeichen getrennt) ausdenken.
Zitat: | Wird mit listen z.B. eine TextDatei gemeint? |
Damit meine ich eine Liste, in der ein Objekt pro Mess-Ergebnis rein kommt.
In meinem Beispiel oben wäre die Variable 'measurements' diese Liste.
Zitat: | Was wird genau mit auf Platte schreiben gemeint und welche Datei kann ich mir da vorstellen? |
Damit meine ich den Vorgang, in dem eine Zeile in irgendeine Datei geschrieben wird.
Jede bereits ausprogrammierte Art, etwas in eine Datei zu speichern, wird früher oder später an dem Punkt angelangt sein, dass es einen Text in eine Datei schreiben.
Das heißt dann, es teilt dem Windows mit, es soll doch mal bitte den angegebenen Text in eine Datei schreiben und Windows sorgt dann dafür, dass dieser Text möglichst bald in die Datei - also auf die Festplatte - geschrieben wird.
PS:
Nun war ich doch ein bisschen zu langsam
Da ich aber gerade das lese:
Zitat: | Ja es sollte möglich sein auch ohne meiner Anwendung die Messwerte zu sehen ( z.b. Excel). |
Dann fällt XML, binäres serialisieren (was Christoph zeigt), oder ähnliches raus.
Du könntest z.B. CSV nehmen, Excel kann das darstellen und es gibt online mehrere Möglichkeiten zu finden, die CSV schreiben oder Lesen können.
Oder Du schreibst das CSV selber, am Ende sind das ja nur durch Semikolon getrennte Werte.
|
|
Christoph1972
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: So 17.01.16 09:47
Guten Morgen
Also, wenn XML und Binary wegfallen, dann würde ich statt csv doch lieber die XML Variante vom DataTable nehmen. Beides ich ist untypisiert, beide Formate können mit Excel geöffnet werden. XML kann man sich zudem mit einem Internet Browser anschauen. Die CSV Reader die ich bisher verwendet habe, haben auch immer nur eine Tabelle ausgegeben.(Gut möglich das es mittlerweile neue im Netz gibt??) Bei der Variante mit DataTable fällt zudem das String-Gefrickel weg. CSV finde ich irgend wie Altbacken, das gibt es schon seit 1967
_________________ Gruß
Christoph
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: So 17.01.16 13:27
Stimmt schon, dass CSV altbacken ist, aber es ist einfach und funktioniert überall.
Aber wie kann Excel XML anzeigen? So auf die Schnelle habe ich keine einfache Lösung gefunden, nur dass man ein Zuordnungsschema erstellen muss.
Ich persönlich finde CSV immer noch am besten geeignet. In Excel kann es sofort ohne Anpassungen geöffnet werden und ist kinderleicht zu schreiben.
Kurzes Googlen hat diese CSV-Library ergeben.
Ein kleines Beispiel:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| public class Measurement { public int Size { get; set; } public DateTime Timestamp { get; set; } }
public static class MeasurementSource { private static readonly Random _rnd = new Random();
public static int GetNextSize() { return _rnd.Next(0, 1000); }
}
class Program { static void Main(string[] args) { using (var csvFile = new CsvFile<Measurement>("measurements.csv")) { for (int i = 0; i < 10; i++) { Thread.Sleep(500);
var measurement = new Measurement() { Size = MeasurementSource.GetNextSize(), Timestamp = DateTime.Now, };
csvFile.Append(measurement); } } } } |
Das Ergebnis in CSV:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Size;Timestamp 571;17.01.2016 12:17:59 159;17.01.2016 12:17:59 713;17.01.2016 12:18:00 872;17.01.2016 12:18:00 517;17.01.2016 12:18:01 135;17.01.2016 12:18:01 870;17.01.2016 12:18:02 761;17.01.2016 12:18:02 200;17.01.2016 12:18:03 591;17.01.2016 12:18:03 |
In Excel lässt sich das problemlos öffnen, zumindest bei mir ist Excel als Standart-Programm für CSV eingestellt und ich dann es direkt mit Doppelklick öffnen.
Und das Lesen im Programm:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| using (var measurements = new CsvFileReader<Measurement>("measurements.csv")) { foreach (var measurement in measurements) { Console.WriteLine("Size: " + measurement.Size); Console.WriteLine("Timestamp: " + measurement.Timestamp); Console.WriteLine("=============================="); } }
Console.ReadKey(); |
Das sieht dann so aus:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| Size: 571 Timestamp: 17.01.2016 12:17:59 ============================== Size: 159 Timestamp: 17.01.2016 12:17:59 ============================== Size: 713 Timestamp: 17.01.2016 12:18:00 ============================== Size: 872 Timestamp: 17.01.2016 12:18:00 ============================== Size: 517 Timestamp: 17.01.2016 12:18:01 ============================== Size: 135 Timestamp: 17.01.2016 12:18:01 ============================== Size: 870 Timestamp: 17.01.2016 12:18:02 ============================== Size: 761 Timestamp: 17.01.2016 12:18:02 ============================== Size: 200 Timestamp: 17.01.2016 12:18:03 ============================== Size: 591 Timestamp: 17.01.2016 12:18:03 ============================== |
PS:
Das Ding ist wirklich schnell.
Wenn ich eine Million Einträge schreiben will, dauert (bei einer Messung) ca. 5,38 Sekunden.
Das Lesen der zuvor angelegten Datei dauert ca. 4,33 Sekunden. Excel braucht da schon deutlich länger
Für diesen Beitrag haben gedankt: mkRE
|
|
mkRE
Beiträge: 98
|
Verfasst: So 17.01.16 17:07
Hallo Leute erstmal bin ich sehr sehr begeistert über euer Engagement und die Beispiele -> mehr als ich erwartet habe!!
Ich habe somit viel Stoff wo ich ansetzen kann .
Ich komme nochmal zu der Excel Datei bzw. jetzt aktuell CSV Format zurück.
Das war in erster Linie angedacht, das bei der Anwendung die Möglichkeit besteht auf Anfrage diese Datei bzw. Messwert Erfassung jederzeit herunter zu laden damit das auf jeden Haushalt PC angezeigt werden kann, ich glaube aber das habt ihr auch so verstanden.
Wenn jedoch direkt in CSV Format zu schreiben sinnvoll wäre für die angedachte Anwendung, dann interessiert mich wie die Performance bei CSV ist bzw. bin ich da ggf. Zeitlich ihrgendwann an der Grenze wenn es um die schreib Intervalle geht?
Viele wege führen nach Rom aber welcher weg ist der professionelle?
Christoph1972 und Palladin007 eure Ansätze vor dem CSV Thema ist für mich Professional angedacht kiene Frage, da Ihr das auch im Täglichen leben nutzt wie ich verstanden habe.
Aber wie sieht es da mit csv aus für z.B. Messanwendungen(Ich weiß das es verwendet wird aber was ich gesehen habe halt nur als gute Lösung um das Ergebnis Universell auf jedem PC anzeigen zu können via Excel usw. )?
Viele Grüße an alle!!
|
|
mkRE
Beiträge: 98
|
Verfasst: So 17.01.16 17:32
Hallo C#, habe dich übersehen sorry
C# hat folgendes geschrieben : |
Also wenn ich das richig sehe, besteht dein Datensatz nur aus einem Integer Wert, korrekt?
|
Ich habe bei dem Messwert an ein Real bzw. Float Wert gedacht weil ich noch einige nach Kommastellen haben möchte.
Vielleicht ist das noch wichtig als Information.
Viele Grüße
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 17.01.16 17:53
Zitat: | Wenn jedoch direkt in CSV Format zu schreiben sinnvoll wäre für die angedachte Anwendung, dann interessiert mich wie die Performance bei CSV ist bzw. bin ich da ggf. Zeitlich ihrgendwann an der Grenze wenn es um die schreib Intervalle geht? |
File schreiben ist File schreiben da ist das interne Format relativ irrelevant. Wenn du dich zwischen Formaten entscheidest sind die der Faktor Lesbarkeit (soll der Inhalt ohne Zusatzinformation verstehbar sein), Kompaktheit (wieviel Redundanz bringt das Format mit um insbesondere ersteren Punkt zu erreichen) und Weiterverabeitbarkeit (können Fremdsysteme die nix von meiner Anwendung wissen was da was mit anfangen, das angesprochene Excel zum Beispiel) entscheidend. Ein wichtiger Faktor, der bei dir aber wohl nicht wichtig ist, ist ob Daten einfach Appendable sind. Xml, Json sind da eher schwierig zu handhaben und fertige System im Framework gehen eher von komplett lesen/schreiben aus. CSV Daten sind leicht anhängbar darum sind ja die meisten Log Fileformate csv oder zumindest csv ähnlich bzw. binär dann aber schwer von Fremdsystemen weiterverarbeitbar. Soweit ich dein anliegen verstehe ist ein csv Format den anderen Kandidaten vorzuziehen. Letztlich aber wenn du ein sauberes Klassensystem aufgesetzt hast ist der zu benutzende Serializer leicht auszutauschen. Ob es dann JSON, XML, binär, CSV oder was auch immer ist nur noch eine Frage von ein paar Handgriffen. Bei einer Lösung mit einer DataTable wärst du allerdings eher ein gefangener dieser Lösung. Das mal schnell zu ändern eher schwierig. Da du eine Lösung um die DataTable herum schreiben würdest ist die schwer wieder loszuwerden wenn sich die Anforderungen ändern. Ich würde davon, in einer lebenden Anwendung deren Anforderungen nicht festgemeißelt sind, abraten.
Zitat: | Aber wie sieht es da mit csv aus für z.B. Messanwendungen |
Messen ist ein ziemlich allgemeiner Begriff. Teilbereiche haben vermutlich spezielle Formate die sich irgendwann als Quasistandard herausgebildet haben. Z.B. Network Sniffer (für mich auch eine Art Messanwendung) benutzen gern pcap (oder Abwandlungen davon). Wenn es sowas in deiner Teildisziplin gibt schau es dir an. Wenn nicht scheint csv erstmal eine gute Wahl.
Zuletzt bearbeitet von Ralf Jansen am So 17.01.16 18:41, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: mkRE
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: So 17.01.16 18:40
Zitat: | Wenn jedoch direkt in CSV Format zu schreiben sinnvoll wäre für die angedachte Anwendung, dann interessiert mich wie die Performance bei CSV ist bzw. bin ich da ggf. Zeitlich ihrgendwann an der Grenze wenn es um die schreib Intervalle geht? |
Hast Du mein PS gelesen?
Um Performance mach dir mal keine Sorgen, nach meiner kurzen Messung hast Du in einer Sekunde Zeit für ca. 185000 Messungen.
In einer Sekunde, 185000 Messungen, meins Du, Du kommst da auch nur ansatzweise ran?
Da wird deine ganze Anwendung drum herum schon so stark ausbremsen, dass das nicht funktioniert.
Und ich habe keine SSD
Das Gleiche für das Lesen der Datei.
So viele Messdaten kannst Du gar nicht sammeln, dass Du bei dieser CSV-Library ein Performance-Problem bekommst.
|
|
mkRE
Beiträge: 98
|
Verfasst: So 17.01.16 23:18
Hallo zusammen, also ich glaube ich habe alle Informationen die ich benötige und wirklich sinnvolle Lösungen erhalten.
Ich kann es nicht oft genug sagen aber ein Lob an die Forum Mitglieder!!!
Für diese Anwendung werde ich besonders aus den Weiterverarbeitungsgründen und der einfachen Handhabung die csv Version wählen.
Hat für meinen Anwendungsfall doch viele Vorteile.
Noch habe ich eine kleinigkeit an Palladin007:
Meinst du den PS zur Performance Geschichte? und was meinst du mit deiner kurzen Messung?
Wünsche euch einen schönen Abend.
Viele Grüße
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: So 17.01.16 23:58
mkRE hat folgendes geschrieben : | Meinst du den PS zur Performance Geschichte? und was meinst du mit deiner kurzen Messung? |
Das PS unter der Nachricht mit meinem CSV-Beispiel, wo ich mal aufgeführt habe, wie lange es dauert, eine Million Objekte in eine CSV-Datei zu schreiben.
Das meine ich auch mit "meiner kurzen Messung": Die Messung, wo ich die Million Einträge in die Datei schreibe und messe, wie lange das dauert.
Ich wollte damit nur aufführen, dass die Library tatsächlich so schnell ist, wie sie verspricht und Du die Frage, ob es eine Performance-Grenze gibt, komplett ignorieren kannst.
Die Performance-Grenze kommt wenn dann von dir bzw. deiner Anwendung und da haben wir keinen Einfluss drauf.
|
|
mkRE
Beiträge: 98
|
Verfasst: Mo 18.01.16 00:06
Ok habs jetzt verstanden danke dir!!
Habt mir echt weitergeholfen.
|
|
mkRE
Beiträge: 98
|
Verfasst: Sa 06.02.16 16:26
Hallo zusammen,
ich habe mich gestern an das Thema hier auch in der Praxis probiert.
Ich habe es soweit hinbekommen daten zu lesen und zu schreiben in und aus einer csv Datei.
Ich benutze jedoch den StreamReader und StreamWriter.
Lieber hätte ich das so wie Palladin007 es in seinen Beispielen gezeigt hat leider habe ich da noch einige Verständnis Probleme.
Ich bekomme hier immer SyntaxFehler Anzeige bei bzw. unter <Measurement> var csvFile = new CsvFile<Measurement>("measurements.csv") als hätte ich da keine Using Direktive.
Das wäre so mein erstes Problem.
Ein weiteres Problem ist, das ich gemerkt habe das csv eine Textdatei ist und die Daten sind dann immer schön in einer Spalte wenn ich es mit Excel Aufmache
Zelle A1
Zelle A2
""
""
So wie ich mich im Netz eingelesen habe kann ich die Daten nicht wie bei Excel in gezielte Zellen z.B. A1 B1 C1 usw schreiben.
Für meinen Anwendungsfall ist ist nicht so wichtig aber es würde mich interessieren ob ich es richtig verstanden habe, das es gar nicht möglich ist?
Ich bin mir nicht ganz sicher aber ich meine gesehen zu haben, das ich mal bei einem Datalogger eine csv. Datei generieren kann und die Daten dan in verschiedenen Zellen und Spalten hatte.
Jedoch bin ich mir da nicht ganz sicher.
Würde mich freuen wenn wir die Punkte noch etwas diskutieren könnten.
Vielen Dank
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Sa 06.02.16 16:36
Zitat: | So wie ich mich im Netz eingelesen habe kann ich die Daten nicht wie bei Excel in gezielte Zellen z.B. A1 B1 C1 usw schreiben. |
Simple Antwort "Excel ist halt eine unappetitliche braune Masse". Auch wenn c in csv für character oder comma steht versteht Excel als Trennzeichen standardmäßig nur Semikolon.
Zitat: | Ich bekomme hier immer SyntaxFehler |
Eine halbwegs aktuelle Visual Studio/Framework Version sollte das eigentlich kennen.
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Sa 06.02.16 17:01
Zitat: | Ich bekomme hier immer SyntaxFehler |
Du musst die CSV-Library auch in dein Projekt mit auf nehmen
Schau dir mal den Artikel an, wo ich das her habe, da wird alles erklärt.
Ganz unten steht dann der Source, den einfach in eine cs-Datei kopieren, passende using-Direktive hinzufügen und fertig.
|
|
mkRE
Beiträge: 98
|
Verfasst: So 07.02.16 15:24
Hallo Ralf,
Zitat: | Simple Antwort "Excel ist halt eine unappetitliche braune Masse". Auch wenn c in csv für character oder comma steht versteht Excel als Trennzeichen standardmäßig nur Semikolon. |
Ok die Trennzeichen wären also der Unterschied. Danke
Aber das mit der unappetitlichen braunen Masse musst du mir bitte mal erklären ( Ich vermute das du damit die Flexibilität in verschiedenen Spalten und Zeilen meinst)
Viele Grüße
|
|
mkRE
Beiträge: 98
|
Verfasst: So 07.02.16 15:26
Hallo Palladin007,
danke vielmals ich hab den Link übersehen
Viele Grüße
|
|
mkRE
Beiträge: 98
|
Verfasst: Sa 27.02.16 18:33
Hallo zusammen,
ich habe mal eine Frage welche im Zusammenhang mit der Beispielanwendung von Palladin007 zusammenhängt.
Dieses Beispiel funktioniert wunderbar ich habe diese in WinForms laufen.
Wenn ich nun wie im Code Thread.Sleep(500) verwende passt es ganz gut das jede Sekunde 2 Einträge gemacht werden.
Jetzt habe ich das Thema mal ausprobiert bei Thread.Sleep(250) komme ich auch auf 4 Einträge pro Sekunde wunderbar.
Wenn ich nun Thread.Sleep(20) eintrage sollte ich theoretisch auf 50 Einträge kommen jedoch sind es bei mir nur 32 Einträge pro Sekunde.
Gehe ich noch weiter Thread.Sleep(1) dann müsste ich ja 1000 Einträge pro Sekunde erwarten da komme ich nicht mal annähernd ran.
Nun zu der Frage warum verhält sich das ganze im höheren Taktbereich auf einmal so komisch das ich nicht mehr auf die erwarteten Einträge komme?
Mit Thread.Sleep sage ich dem System doch das ich in der angegebenen Zeit eine Ruhepause brauche und danach soll der Vorgang wieder fortgeführt werden.
Wenn ich das ganze ohne Thread Sleep ausführe habe ich in ca 3,..s 1.000.000 Einträge ich wollte das aber im höheren Taktbereich etwas kontrollieren jedoch passt das nicht mehr wie oben beschrieben.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| using (var csvFile = new CsvFile<Measurement>("measurements.csv")) { for (int i = 0; i < 100; i++) { Thread.Sleep(500);
var measurement = new Measurement() { Size = MeasurementSource.GetNextSize(), Timestamp = DateTime.Now, };
csvFile.Append(measurement); } } |
Habt Ihr eine Idee woran das liegt?
Freue mich auf Ideen und Antworten.
Viele Grüße
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Sa 27.02.16 18:55
Zitat: | Mit Thread.Sleep sage ich dem System doch das ich in der angegebenen Zeit eine Ruhepause brauche und danach soll der Vorgang wieder fortgeführt werden. |
Nicht ganz du sagst das du mindestens solange schlafen willst. In Windows bekommt jeder Thread mal Rechenzeit zugewiesen das steuert Windows und nicht irgendein User Prozess. Und mit Thread.Sleep sagt du "Ich brauche jetzt keine Rechenzeit mehr und bevor n Millisekunden abgelaufen sind brauchst du mir auch keine mehr zuzuweisen".
Und 2.tens es gibt ein Mindestauflösung wie oft Windows Taskwechsel versucht die Standardmäßig irgendwo bei 15,6ms liegt. Die Auflösung kann man zwar ändern sollte man aber nicht tun (Kostet richtig Performance und Strom wenn man Windows ganz oft dazu zwingt zu prüfen ob es einen Taskswitch machen muß und im schlimmsten Fall auch ganz oft Takswitches durchführen lässt).
|
|
mkRE
Beiträge: 98
|
Verfasst: Sa 27.02.16 19:59
Hallo Ralf danke für die schnelle Anwort gut erklärt!
Ralf Jansen hat folgendes geschrieben : |
"Ich brauche jetzt keine Rechenzeit mehr und bevor n Millisekunden abgelaufen sind brauchst du mir auch keine mehr zuzuweisen".
|
Den Schlußteil deines Satzes jedoch hoffe ich habe ich richtig verstanden das nach Ablauf der angegebenen Zeit noch keine Rechenzeit zugewiesen wurde?!
Aber erst wenn sich die Schleiße wie im oberen Code fortführt, bekomme ich wieder Rechenzeit reserviert bzw. zugewiesen? Funktioniert das so?
Ich muss zugestehen hier kenne ich mich nicht so gut aus.
Mit welcher möglichkeit würde ich den dann auf einen stabilen bzw. zuverlässigen Takt von z.B. 1 - 20ms unter windows kommen?
Der WinForms Timer liegt auch bei ca. 15ms an seinen Grenzen jetzt weiß ich nicht ob der Multimedia Timer das stabil hinbekommt.
Viele Grüße
|
|
jfheins
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Sa 27.02.16 20:09
mkRE hat folgendes geschrieben : | Mit welcher möglichkeit würde ich den dann auf einen stabilen bzw. zuverlässigen Takt von z.B. 1 - 20ms unter windows kommen? |
Eigentlich gar nicht, am ehesten noch mit Windows-Embedded.
Grund ist, dass in Windows eigentlich jederzeit ein Prozess mit hoher Priorität Rechenzeit verlangen könnte. Die bekommt er in der Regel auch, und dein Programm guckt in die Röhre. Aber selbst wenn du dich hochpriorisiert und rechnest, wird Windows dein Programm ab und an unterbrechen damit andere auch mal rechnen dürfen. Und eventuell ist auch mal der RAM voll und die HDD schläft gerade ...
Wenn du wirklich einen zuverlässigen Takt brauchst, nimm einen Mikrocontroller den du bspw. an einen seriellen Port anschließt.
|
|
|