MFC+In die Datei schreiben
-
Hallo Leute.
Ich hab eine kleine dialogbasierte Anwendung, mit der ich Werte in eine Textdatei schreibe. Ich schreibe die Sachen im Append-Mode. Gibt es da performancemäßig viel Unterschiend, ob die Datei zum Anfang 0KB ist und nach einem Tag Messen 500 MB erreicht hat? Kann es dann dazu kommen, dass Daten verloren gehen? (dass win nur die textdateien bis 1 GB verträgt, habe ich schon irgendwo gelesen).Ich lese immer ein Array von 1000 Messwerten aus und speichere diese in einer Textdatei.
In meinem Dialog habe ich eine Lisbox, wo ich jedes mal die Werte ausgeben lasse, dazu noch ein kleines Diagramm mit der Setpixel Methode. Wenn ich die Ausgabe der Listbox und des Graphen auskommentiere, habe ich saubere fortlaufende Messwerte (zur Zeit Pattern Generator) mit der Listbox und dem Graphen gehen mir jedoch die Werte verloren. Wird durch diese ganze Sache das Schreiben auch verzöggert?
-
Ich denke, das liegt daran, dass sich deine Listbox jedesmal neu zeichnet.
Andernfalls würde ich versuchen, deine Arbeit auf Threads zu verteilen.
-
Performance mäßig gibt es keine Unterscheidung ob die mit 0 KB beginnst oder nicht (wenn die Datei schon da ist musst Du nur hinspringen... ist aber verträglich).
Win hat keine Probleme mit Dateien die mehrere Tera-byte gross sind... Falls Du FAT32 verwendest solltest, dann ist das Dateisystem auf 2 GB beschränkt... deshalb verwende NTFS.
Für mich hört sich das ganze aber an, als ob es sinnvoller wäre eine Datenbank (z.B. SQL-Server oder Oracle) zu verwenden... du willst ja schliesslich wieder auf die Daten zugreifen... und eine GB grosse Datei zu durchforsten ist vermutlich etwas langwierig...
In der Datei gehen Dir prinzipiell keine Daten verloren (es sei denn Du schaltest den Rechner aus). Die Daten können Dir höchstens bei Deiner Erfassung verloren gehen (hast Du aber nicht erläutert wie Du das machst...)
Beachte aber bitte: Windows ist kein Echtzeitbetriebssystem!!! Also falls Du was in kleinen Zeitabständen lesen willst, dann ist es fast garantiert dass Dir was verloren geht!
-
Wie Jochen schon sagt, musst du wohl deine Datenerfassung synchronisieren. Da könnte dir CEvent weiterhelfen.
-
Danke für eure Hilfe.
Ich habs eigentlich alles schon recht schlau realisiert, dass mir die Daten möglichst nicht verloren gehen, mit Datenarrays, Temparrays und Busybits etc.
Funktionier wunderbar. Ich war bloss ein wenig enttäuscht, dass eine Listbox mit 1000 Zeilen mein Programm so abgebremst hat, dass ich doch einen Datenverlust hatte. Nur ist es halb so wild, da ich die Listboy ehe nur zum Testen hatte, ob die Daten ankommen. Was mir halt Sorgen gemacht hat, ob in die Datei bei mehr als 100 MB langsammer geschrieben wird. Anscheinend ist es nciht der Fall, bin schon bei 200 MB und die Daten kommen anIch hab einen Patterngenerator an das EV-Board angeschlossen, was mir die Zahlen von 0-127 durchgehend mit einem Takt von 50µs ausgibt. Diese lese ich mit meinem Programm ein und speichere in die Textdatei.
Hier ist eine Beispielausgabe:
Pattern | Arraystelle
96 994
97 995
98 996
99 997
100 998
101 999
102 0
103 1
104 2
105 3
106 4wie man sieht an der Arraystelle 0 kommt 102, was natürlich richtig ist. Nur als ich die Listbox an hatte, war das nicht der Fall da hatte ich Zeitweise sprünge von z.B. 34 auf 86....
-
sadi schrieb:
mit einem Takt von 50µs ausgibt
Das ist jetzt aber ein Witz, oder? Dat kann Windows nie! (der hat schon mit 20ms Probleme)
-
Du hast mich falsch verstanden. Die Daten werden von einem externen Board eingelesen. Diese speichere ich in einem 1000 Zeilen großen Array, und wenn das Array 1000ste Stelle erreicht hat, lese ich diese Daten mit dem PC aus. Die Datei werden über eine Ethernetverbindung übertragen, dabei wird ein spezielles Echtzeitprotokoll genutzt. http://www.ethercat.org
50µs*1000=50ms die Zeit reicht für Windows um die Werte zu lesen. Außerdem fahre ich das ganze mit der höchstmöglichen Frequenz, später wird es ehe nciht so schnell laufen..Ich studiere eigentlich Nachrichtentechnik und hab es mit Programmieren nicht so einfach, wie ein Informatikstudent. Muss aber bei meinem Praktikum ein Programm dafür mit MFC realisieren, was ich eigentlich schon fast fertir gemacht habe.
-
Hallo,
hatte das Problem mit der Listbox auch schon und diese bremst immer
aus. Eine Listbox kann man generell nicht volllaufen lassen, gerade
wenn man Messungen macht. Deswegen haben wir immer die Zeilenzahl
festgelegt und bei erreichend er Grenze nach FIFO aussortiert.
Evtl. kannst Du noch was rausholen, indem Du das Neuzeichnen der
Box mit BlockWindowUpdate blockierst. Musst mal die Zeiten messen.