Question

J'ai piraté le code de Xournal afin d'ajouter une fonctionnalité de sauvegarde automatique. Ma mise en œuvre initiale était très stupide: toutes les 60 secondes environ, faites une sauvegarde. La fonctionnalité fonctionne apparemment.

Cependant, après avoir testé pendant un certain temps, j'ai remarqué que lors de l'exécution de la sauvegarde automatique, l'application se bloque temporairement, ce qui est assez gênant si vous êtes au milieu d'un trait de stylo. J'essaie de comprendre comment résoudre ce problème.

L’une des possibilités que j’ai imaginées est, pour la sauvegarde automatique, de vérifier si le stylo touche l’écran avant de sauvegarder automatiquement; si vous le touchez, joignez un rappel unique programmé une seconde après la levée du stylet. (si la même chose se produit, répétez). Une autre possibilité serait d’optimiser suffisamment la fonction de sauvegarde afin qu’il n’y ait pas d’espace vide (cela semble peu probable).

Quelqu'un a des suggestions à ce sujet? Xournal utilise la boîte à outils Gnome / GTK et est écrit en C.

Mise à jour: J'ai mis en œuvre la logique anti-obstruction, et je suis très satisfait de la granularité et des performances de la sauvegarde automatique qui en résulte. Une de ces fois les threads ne sont (heureusement) pas nécessaires! Merci à tous pour vos suggestions.

Était-ce utile?

La solution

Si l'interface utilisateur se fige pendant une période de temps notable, un thread séparé est probablement la solution. Si la seule raison pour laquelle vous remarquez le gel de l'interface utilisateur est parce que vous écrivez à ce moment-là et que l'interruption n'est que très brève, votre méthode peut fonctionner. Votre solution est probablement beaucoup plus simple que de créer un autre thread, essayez-la d'abord.

Si vous utilisez des threads, choisissez g_threads au lieu de pthreads puisque vous utilisez GTK +. Ils seront plus portables.

Autres conseils

Bien que je sois d’accord pour dire que l’utilisation de threads est un "correct" textbox answer, ce n’est pas toujours la façon dont vous devez faire les choses. Le multithreading a tendance à soulever des tonnes de problèmes si vous ne faites pas attention - le principal ici est probablement de verrouiller l'accès aux données pendant la sauvegarde automatique. Ensuite, si le thread principal entre dans une attente pour accéder aux données, vous êtes de retour à votre point de départ. Vous créez alors une file d'attente de modifications en attente ou quelque chose de ce genre, et vous perdez la trace de ce qui se passe. Selon la complexité des structures de données sous-jacentes, la copie peut également geler le fil principal.

Quoi qu'il en soit , je voudrais essayer votre première option. C'est rapide, simple et précis, et je ne vois pas pourquoi cela ne fonctionnerait pas.

(Remarque: je n'ai pas regardé sous le capot de Xournal, alors prenez ceci avec un grain de sel. Ou une salière. Ou quelque chose comme ça)

Pouvez-vous transférer la fonctionnalité de sauvegarde automatique vers un thread séparé? En exécutant un deuxième thread, vous pourrez exécuter la sauvegarde en parallèle avec l'interface graphique et éviter la fenêtre de congélation.

J'ai très peu d'expérience avec c, mais je pense que ce site pourrait aider.

J'ai eu une situation similaire dans le passé et voici comment je l'ai résolue (.Net):

  1. La minuterie d'arrière-plan se met en marche à intervalles de x secondes
  2. Sur la coche, désactivez le minuteur et gérez l'événement approprié.
  3. Dans le gestionnaire d'événements, enregistrez et activez le minuteur.

Le seul problème que nous ayons vu se produit est que quelqu'un a tué l'application avant que le gestionnaire d'événements ne soit appelé et perd une minute de travail.

Comment ça?

Utilisez l'idée de rappel, mais faites-la exécuter toutes les 10 entrées en plus des 60 secondes. Avec une sauvegarde automatique basée sur le temps, il y a un problème selon lequel la quantité de choses perdues est proportionnelle à la vitesse à laquelle l'utilisateur peut travailler.

Si vous souhaitez aller plus loin, faites-le sauvegarder un journal d'annulation partiel sur le disque après chaque modification, en plus de la sauvegarde complète. De cette façon, la pire chose qui puisse arriver d’un accident est de perdre le dernier trait saisi.

Mon objectif est d'utiliser un thread hipervisor pour comparer, via un algorithme de hachage, le contenu du fichier toutes les N secondes lors d'un événement de modification, puis notifier le thread parent et rappeler la fonction de sauvegarde automatique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top