Frage

Ich habe für Xournal, um auf dem Code-Computer gehackt Auto-Save-Funktion hinzuzufügen. Meine erste Implementierung war sehr dumm: alle 60 oder so Sekunden, nicht den Schuß ab. Das Feature angeblich funktioniert.

Allerdings, nachdem es für eine Weile zu testen, habe ich bemerkt, dass, wenn läuft automatisch speichern, vorübergehend die Anwendung einfriert, was sehr ärgerlich ist, wenn man in der Mitte eines Federstrichs sind. Ich versuche, herauszufinden, wie man dieses Problem beheben.

Eine Möglichkeit habe ich gedacht up ist für die automatische Speicherung zu überprüfen, ob der Stift den Bildschirm berührt, bevor das automatische Speichern; wenn es berührt wird, fügen Sie eine einmal nur für einen zweiten geplanten Rückruf nach der Stift angehoben wird. (Wenn das gleiche passiert, wiederholen). Eine andere Möglichkeit wäre es, die Funktion ausreichend so sparen zu optimieren, dass es keine Lücke (scheint unwahrscheinlich).

Wer noch keine Vorschläge dazu? Xournal verwendet den Gnome / GTK-Toolkit, und ist in C geschrieben.

Update: Ich implementiert, um die anti-clobber Logik, und ich bin sehr zufrieden mit der daraus resultierenden automatisch gespeicherte Granularität und Performance. Einer dieser Zeiten Fäden sind (zum Glück) nicht erforderlich! Vielen Dank allen für Ihre Anregungen.

War es hilfreich?

Lösung

Wenn die Benutzeroberfläche für eine merkliche Zeit friert ein separater Thread ist wahrscheinlich der Weg zu gehen. Wenn der einzige Grund sind bemerken Sie den UI-freeze ist, weil Sie zu der Zeit zu schreiben passieren und die Unterbrechung ist nur sehr kurz, dann könnte Ihre Methode arbeiten. Ihre Lösung ist wahrscheinlich viel einfacher, als einen anderen Thread zu schaffen, so versuchen Sie, dass zuerst.

Wenn Sie am Ende Threads verwenden, gehen Sie mit g_threads statt pThreads da Sie GTK + verwenden. Sie werden in mehr tragbar.

Andere Tipps

Während ich zustimmen würde Threads ist eine „richtige“ Textbox Antwort, es ist nicht immer so, wie Sie die Dinge zu tun haben. Multithreading neigt Tonnen von Fragen zu bringen, wenn du nicht aufpasst - das wichtigstes hier wahrscheinlich Zugang ist während der automatischen Speicherung der Daten sperrt. Dann, wenn der Haupt-Thread in einen Warte auf die Daten zuzugreifen, sind Sie wieder da, wo Sie begonnen haben. Also dann erstellen Sie eine Warteschlange von anstehenden Änderungen oder so etwas, und Sie verlieren den Überblick über, was los ist. Je nachdem, wie komplex die zugrunde liegenden Datenstrukturen sind, könnten eine Kopie machen auch den Haupt-Thread einzufrieren.

Anyways Punkt ist, würde ich Ihre erste Option versuchen. Es ist schnell, einfach und auf den Punkt, und ich sehe nicht, warum es nicht funktionieren würde.

(Anmerkung: Ich habe nicht unter der Haube Xournal sah so diese nehmen mit einem Körnchen Salz oder ein Salzstreuer oder so etwas.).

Können Sie die automatische Speicherung Funktionalität zu einem separaten Thread schieben? Durch die Ausführung auf einem zweiten Thread würde Sie in der Lage sein, die sparen parallel zur gui laufen und das Einfrieren Fenster würde vermeiden.

Ich habe sehr wenig Erfahrung mit c bekomme, aber ich würde denken, diese Seite helfen könnte.

Ich habe eine ähnliche Situation in der Vergangenheit hatte und hier ist die Art, wie ich es gelöst (NET):

  1. Hintergrund Timer Ticks bei x-Sekunden-Intervallen
  2. Auf der Zecke, deaktivieren Sie den Timer und behandeln Sie das entsprechende Ereignis.
  3. In den Event-Handler, speichern und den Timer aktivieren.

Der einzige Fehler wir passieren gesehen haben tatsächlich war jemand zu töten die App, bevor die Event-Handler aufgerufen wird und verliert 1 Minute im Wert von Arbeit.

Wie wäre das?

Mit der Callback-Idee aber haben sie alle 10 Eingänge zusätzlich zu je 60 Sekunden laufen. Mit einer zeitbasierten automatischen Speicherung, dann ist es ein Problem, dass die Menge an Material, das proportional verloren geht ist, wie schnell der Benutzer arbeiten kann.

Wenn Sie einen Schritt weiter gehen wollen, es habe eine partielle Undo-Log auf die Festplatte speichern nach jeder Änderung zusätzlich zu den vollen speichern. Auf diese Weise, das Schlimmste, was von einem Absturz verliert den letzten Eingabe-Stroke passieren kann.

Mein Fokus ist ein Hypervisor-Thread Vergleich über einige Hash-Algorithmus der Inhalt der Datei alle N Sekunden auf Änderungsereignis zu verwenden, dann an das Muttergewinde benachrichtigen und die Autosave-Funktion Rückruf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top