errox Geschrieben 29. Juli 2009 Geschrieben 29. Juli 2009 Hallo. Ich hab mal eine frage: Ich hab ein ganz einfaches Programm ( nur zum Beispiel ist es einfach ). 2 Buttons, ein Label. Der Eine Button setzt den Wert des Labels +1, der andere -1. Ist also nichts anderes als ein Kleines Zählprogramm. Jetzt kommt das eigentliche: Nehmen wir an der wert ist bei 7. Wenn ich das Programm beende und es wieder starte soll der Wert auf 7 wieder sein. Sprich es soll sich wiederherstellen. Die Lösung ist ganz einfach: Bei jedem Klick auf den Button wird der Wert in eine Datei zwischengespeichert und beim Laden wird der label nach dem Inhalt der Datei gesetzt. Nehmen wir aber an es geht nicht um eine Zahl sondern um ein Paar Hundert Zahlen und Mehrere Tabs die Geöffnet sind und Einzelne Objekte die durch Klicks verschoben werden: Um alles wiederherzustellen müsste ich jede einzelne Information in eine .ini Schreiben. Es ist zwar einmalig so einen Code zu schreiben, aber nervig. Gibt es nicht die möglichkeit, dass Programm sozusagen "einzufrieren"? Den Aktuellen stand, die aktuellen Werte und alles in eine Datei zu Speichern und alles mit einer Funktion laden? Die Datei darf auch meinetwegen mehrere 100 MB Groß sein, das ist mir wurst. Das laden darf auch ruhig ein Paar minuten dauern. Aber die Anwendung ist für jemanden, der seine Entscheidung schnell ändert. Das heisst "ich will doch Tabs, ich will doch nicht ein Button, doch Tabs, doch Buttons" Das heisst ich muss den Code jedesmal umschreiben wenn was Gelöscht wird, sonst gibts einen fehler weil das Objekt nicht existiert, und wenn was neues hinzugefügt wird, weil es sonst nicht wiederhergestellt wird. Wenn es diese möglichkeit gibt, spart das mir ein Haufen Zeit! Vielen Dank im Vorraus Liebe Grüße errox Zitieren
DITTY Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 Nunja, schonmal nachgeschaut, wie das bei anderen Programmen gemacht wird. Letztendlich bleibt einem nichts anderes übrig, ALLES (Notwendige) in dauerhaft speicherbare Dateien zu schreiben und beim erneuten Aufruf wieder zu laden. Um hier den Überblick zu behalten, sollte man Konfig-Files auch selbst nochmal in mehreren Files aufteilen. So muss man nicht immer den kompletten Inhalt einer einzigen Datei einlesen / in den Speicher hauen, sondern stehts nur die Infos, welche man auch benötigt. Ist schneller und auch speicherschonender! Eine Möglichkeit, so wie Du das Dir vorstellst gibt es nicht, zumal aus rein technischen Gründen. Denn, was Du willst, ist den aktuellen Zustand im Speicher zu halten. Wenn ein Programm allerdings beendet wird, so wird der Speicher vom System her wieder anderen Anwendungen bereitgestellt. Und was ist, wenn Du mal den Rechner neu startest btw. ausmachst? Eben, der RAM wird komplett gelöscht, daher solltest btw. musst Du/man immer wiederherstellbare Informationen auf dauerhaften Medien unterbringen (z.B. HDD). Die Einzige Möglichkeit wäre, wenn MRAM zur Anwendung kommt, aber von einem produktiven Einsatz von MRAM sind wir noch n paar Jahre entfernt. Dann sollte es allerdings keine Probleme geben, wobei des Speichermangels es immernoch ratsamer ist, alles auf Massenspeichermedien auszulagern und nicht im (M)RAM auszulagern, erst recht nicht, wenn es sich um 100Mb-große Dateien handelt. ---------------------------------------------------------------------- Soll es hingegen nur um die aktuell laufende Sitzung gehen, könnte man dem System-Sheduler mitteilen, dem jeweiligen Prozess sämtliche Ressourcen zu entziehen, was bedeuten würde, dass dieser nicht weiter ausgeführt wird. Sobald man das Programm wieder weiter nutzen möchte, soll dem Prozess eben wieder Ressourcen zur Verfügung gestellt werden. Ich kann jetzt aber leider nicht mit Funktionen/Befehlen/Keywords dienen, womit man den Sheduler steuert, da ich ohnehin der Meinung bin und es auch selber praktiziere, alles in Dateien auszulagern, das Programm natürlich ausgeschlossen. Gruß DITTY :) PS: Wenns hier nicht um direkte Befehle (in diesem Falle .NET-spezifische) geht, wäre dieser Thread wohl eher in einem allgemeinen Forum besser aufgehoben. Zitieren
Hahne Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 (bearbeitet) Ich glaube das Stichwort "XML Serialization" oder "Binary Serialization" wäre was für dich... hier mal ein Link: Galileo Computing :: Visual C# 2008 – 11.4 Serialisierung mit »XmlSerializer« Galileo Computing :: Visual C# 2008 – 11.2 Serialisierung mit »BinaryFormatter« Bearbeitet 30. Juli 2009 von Hahne Zitieren
errox Geschrieben 30. Juli 2009 Autor Geschrieben 30. Juli 2009 Nunja, schonmal nachgeschaut, wie das bei anderen Programmen gemacht wird. Letztendlich bleibt einem nichts anderes übrig, ALLES (Notwendige) in dauerhaft speicherbare Dateien zu schreiben und beim erneuten Aufruf wieder zu laden. Dann werd ich das auch tun. Vielen Dank. Ich dachte aber, dass ich den Arbeitsspeicher der Verwendet wird in eine Datei packen kann und ihn wieder laden kann. Also bei jeder Aktion die durchgeführt wird, wird der Arbeitsspeicher 1:1 gespeichert und dann wieder geladen. Die Idee es aber in mehreren Dateien aufzuteilen is aber auch sehr Hilfreich, danke. Zitieren
Klotzkopp Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 Ich dachte aber, dass ich den Arbeitsspeicher der Verwendet wird in eine Datei packen kann und ihn wieder laden kann. Also bei jeder Aktion die durchgeführt wird, wird der Arbeitsspeicher 1:1 gespeichert und dann wieder geladen.Das geht nur für's ganze System (nennt sich Ruhezustand), aber (zumindest unter Windows) nicht für einzelne Prozesse. Die Idee es aber in mehreren Dateien aufzuteilen is aber auch sehr Hilfreich, danke.Ich halte das für Käse. Selten kann man das so klar trennen. Wenn man nur eine einzige Abhängigkeit übersieht, hat man schnell einen inkonsistenten Programmzustand. Ein Programm hat einen Zustand. Damit meine ich nicht das aktuelle Speicherabbild, sondern eine möglichst abstrakte Darstellung. Diese gilt es zu serialisieren. Das Programm sollte sein UI allein aus dem Zustand aufbauen können. Wenn man das UI gut von der Logik getrennt hat, geht das auch sehr gut. Zitieren
errox Geschrieben 30. Juli 2009 Autor Geschrieben 30. Juli 2009 Ok. Ich weiss jz, dass ich das Ganze System einfrieren kann ( den Ruhezustand hab ich vollkommen vergessen ) Dass man nur einen Prozess einfrieren kann geht nicht. Das weiss ich jetzt auch. Warum genau, nicht wirklich. Nur, dass es nicht geht Wär schön wenn ich das auf Nicht so Hochniveau Deutsch erklärt bekommen würde Das heisst mir bleibt wirklich nichts anderes übrig Dateien zu schreiben. Das mit dem Trennen finde ich desshalb eine gute Idee, weil ich verschiedene Tabs hab mit verschiedenen Inhalten. Die Anzahl der Tabs und die Jeweiligen Namen kann ich ja in einer Datei Speichern. Und der Jeweilige inhalt in eine Jeweilige Datei. Zitieren
Klotzkopp Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 Warum genau, nicht wirklich. Nur, dass es nicht geht Wär schön wenn ich das auf Nicht so Hochniveau Deutsch erklärt bekommen würde Jeder Prozess fragt Dinge vom Betriebssystem an. Critical Sections, Mutexe, Handles auf alle möglichen Dinge. Selbst bei einfachsten Programmen passiert das "unter der Haube". Diese Dinge sind aber nicht Teil des Prozesses, würden also nicht mit gesichert. Und wenn sich der Zustand des Betriebssystems beim Wiederherstellen geändert hat, passt das alles nicht mehr zusammen. Einfachster Fall: Der Prozess hatte eine Datei geöffnet, die zwischenzeitlich gelöscht wurde. Schlimmster Fall: Der Prozess besitzt zum Zeitpunkt des Einfrierens einen systemweiten Mutex, auf den alle anderen Prozesse warten müssen. Das mit dem Trennen finde ich desshalb eine gute Idee, weil ich verschiedene Tabs hab mit verschiedenen Inhalten. Die Anzahl der Tabs und die Jeweiligen Namen kann ich ja in einer Datei Speichern. Und der Jeweilige inhalt in eine Jeweilige Datei.Sind die Inhalte der Tabs denn wirklich komplett voneinander unabhängig? Einzelne Dateien sind nur sinnvoll, wenn du sie dann auch einzeln einlesen könntest. Wenn du hinterher sowieso alle Dateien auf einmal liest, hast du nichts gewonnen. Zitieren
DITTY Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 (bearbeitet) Das geht nur für's ganze System (nennt sich Ruhezustand), aber (zumindest unter Windows) nicht für einzelne Prozesse. Beim Ruhezustand lässt sich aber das System nicht bedienen. Ich halte das für Käse. Selten kann man das so klar trennen. Wenn man nur eine einzige Abhängigkeit übersieht, hat man schnell einen inkonsistenten Programmzustand. Einzelne Dateien sind nur sinnvoll, wenn du sie dann auch einzeln einlesen könntest. Wenn du hinterher sowieso alle Dateien auf einmal liest, hast du nichts gewonnen. Wieso Käse, natürlich kann es sich lohnen. Nicht immer muss alles eingelesen werden, sondern nur das gerade Notwendige. Das spart zum einen Zeit (muss schließlich weniger eingelesen werden) und zum anderen Speicher (da jedes Mal nur das Notwendige in den Speicher geladen werden muss). Was bringt es Alles in eine einzige Datei zu stecken? Was hat z.B. Bei Spielen die Konfig mit dem Spielstand (save) zu tun? Selbst bei Konfig-Files kann man noch klar trennen, je nach Themen, sodass zum jeweiligen Zeitpunkt auch nur die Inhalte geladen werden müssen, welche auch wirklich zum jeweiligen Zeitpunkt anstehen / abverlangt werden. Zudem kann das Einlesen einer 100 Mb-Datei durchaus dauern und ggfl. den Prozess für kurze Zeit frozen und unbenutzbar machen, zumal der RAM-Speicher nicht all zu groß ist. Dass man nur einen Prozess einfrieren kann geht nicht. Das weiss ich jetzt auch. Warum genau, nicht wirklich. Nur, dass es nicht geht Wär schön wenn ich das auf Nicht so Hochniveau Deutsch erklärt bekommen würde Na doch, geht schon. Wie ich schon erwähnte, bekommen alle Prozesse System-Ressourcen, z.B. CPU-Zeit vom System-Sheduler zugewiesen. Wenn man dem Sheduler nun mitteilt, dem eigenen Prozess sämtliche Ressourcen zu entziehen, ist das gleichbedeutend eines Stillstandes (Frozezustand). Das Programm ressidiert trotzdem weiter im Speicher, solange, bis es entweder wieder freigegeben (beendet wird) oder wieder vom Sheduler Ressourcen zur weiteren Ausführung zugeteilt bekommt. Aber wie gesagt, mir ergibt sich da kein Sinn, so etwas zu machen, zumal dies nur möglich bei noch laufenden Prozessen geht. Dann könnte man das Programm intern aber so coden, dass es beim Nichtverwenden seinen Dienst abbricht (Siehe z.B. Pause-Modus bei Games). Wenn es hingegen darum geht, ein Programm zu beenden und später an gleicher Stelle wieder zu starten, bleibt nichts anderes übrig, als den aktuellen Zustand auf die Festplatte auszulagern, da beim Beenden eines Prozesses der RAM-Speicher wieder freigegeben wird. Wie ich schon sagte, kann ich jetzt leider nicht mit Befehlen/Keywords dienen, womit man den System-Sheduler ansteuert, erst recht nicht in C#, da ich bevorzugter C++ler bin. Aber die logische Vorgehensweise bleibt bei beiden Sprachen die gleiche. Wenn also jemand entsprechende Lösungsansätze hat und mit Befehlen/Keywords dienen kann, soll er sie doch bitte posten. Gruß DITTY :):) Bearbeitet 30. Juli 2009 von DITTY Zitieren
errox Geschrieben 30. Juli 2009 Autor Geschrieben 30. Juli 2009 Einfachster Fall: Der Prozess hatte eine Datei geöffnet, die zwischenzeitlich gelöscht wurde. Versteh ich. Wird nicht vorkommen Schlimmster Fall: Der Prozess besitzt zum Zeitpunkt des Einfrierens einen systemweiten Mutex, auf den alle anderen Prozesse warten müssen. Versteh ich nicht. Was ist ein Mutex? Sind die Inhalte der Tabs denn wirklich komplett voneinander unabhängig? Einzelne Dateien sind nur sinnvoll, wenn du sie dann auch einzeln einlesen könntest. Wenn du hinterher sowieso alle Dateien auf einmal liest, hast du nichts gewonnen. Es handelt sich hier um ein Multitaschenrechner. Verschiedene Tabs, gleiches Fenster ( Buttons sind gleich, etc. ) blos der Inhalt der Gerechnet wird. Kann man sich wie in nem Kassensystem mit verschiedenen Tischen und verschiedenen Bestellungen auf den Jeweiligen Namen. Na doch, geht schon. Wie ich schon erwähnte, bekommen alle Prozesse System-Ressourcen, z.B. CPU-Zeit vom System-Sheduler zugewiesen. Wenn man dem Sheduler nun mitteilt, dem eigenen Prozess sämtliche Ressourcen zu entziehen, ist das gleichbedeutend eines Stillstandes (Frozezustand). Das Programm ressidiert trotzdem weiter im Speicher, solange, bis es entweder wieder freigegeben (beendet wird) oder wieder vom Sheduler Ressourcen zur weiteren Ausführung zugeteilt bekommt. Was is aber wenn das System Abstürzt durch einen Stromausfall? Es soll ja eine AutoBackupstartup Funktion sein. Wie ich schon sagte, kann ich jetzt leider nicht mit Befehlen/Keywords dienen, womit man den System-Sheduler ansteuert, erst recht nicht in C#, da ich bevorzugter C++ler bin. Ich auch Zitieren
flashpixx Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 Versteh ich. Wird nicht vorkommen Doch kommt sogar ständig vor z.B. Registry, DLL usw (nimm das Tool Filemon und schau Dir an, was alles offen ist) Versteh ich nicht. Was ist ein Mutex? kurz gesagt Thread, die abhängig von einander sind Mutex ? Wikipedia Was is aber wenn das System Abstürzt durch einen Stromausfall? Es soll ja eine AutoBackupstartup Funktion sein. Nimm einen Thread, der z.B. alle 5 Sekunden aktiviert wird und die Daten speichert (Timer Thread) Zitieren
errox Geschrieben 30. Juli 2009 Autor Geschrieben 30. Juli 2009 Troz allem will ich lieber auf Klotzkopp hören und es sein lassen. Es kann ja zu Schwierigkeiten kommen. Und ich riskier lieber nichts Zitieren
DITTY Geschrieben 31. Juli 2009 Geschrieben 31. Juli 2009 Was is aber wenn das System Abstürzt durch einen Stromausfall? Es soll ja eine AutoBackupstartup Funktion sein. Also das sind mal Ausnahmefälle, und wenn Du auf Nummer sicher gehen möchtest, musst Du halt so oft, wie möglich die Daten auslagern, damit ein halbwegs aktueller Stand erhalten und nach dem Laden wieder geladen werden kann. Was für einem solchen Fall sehr interessant wär, die BackUp-/Wiederherstellungs-Funktionen von MS Word, OpenOffice Writer. Gruß DITTY :) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.