Domanda

Ho hackerato il codice per Xournal per aggiungere funzionalità di salvataggio automatico. La mia implementazione iniziale era molto stupida: ogni 60 secondi circa, salva. La funzione funziona apparentemente.

Tuttavia, dopo averlo provato per un po ', ho notato che quando si esegue il salvataggio automatico, l'applicazione si blocca temporaneamente, il che è abbastanza fastidioso se sei nel mezzo di un tratto di penna. Sto cercando di capire come risolvere questo problema.

Una possibilità a cui ho pensato è che il salvataggio automatico verifichi se la penna tocca o meno lo schermo prima del salvataggio automatico; se viene toccato, allegare una sola richiamata programmata per un secondo dopo che la penna è stata sollevata. (se succede la stessa cosa, ripeti). Un'altra possibilità sarebbe quella di ottimizzare sufficientemente la funzione di salvataggio in modo tale che non vi siano gap (sembra improbabile).

Qualcuno ha qualche suggerimento al riguardo? Xournal usa il toolkit Gnome / GTK ed è scritto in C.

Aggiornamento: ho implementato la logica anti-clobber e sono molto contento della risultante granularità e delle prestazioni del salvataggio automatico. Una di quelle discussioni non è (per fortuna) necessaria! Grazie a tutti per i vostri suggerimenti.

È stato utile?

Soluzione

Se l'interfaccia utente si blocca per un periodo di tempo evidente, è probabile che un thread separato sia la strada da percorrere. Se l'unica ragione per cui stai notando il blocco dell'interfaccia utente è perché ti capita di scrivere in quel momento e l'interruzione è solo molto breve, il tuo metodo potrebbe funzionare. La tua correzione è probabilmente molto più semplice della creazione di un altro thread, quindi prova prima.

Se finisci per usare i thread, scegli g_threads invece di pthreads poiché stai usando GTK +. Saranno più portatili.

Altri suggerimenti

Anche se concordo sull'uso dei thread è un "corretto" risposta nella casella di testo, non è sempre il modo in cui devi fare le cose. Il multithreading tende a sollevare tonnellate di problemi se non stai attento - il principale qui probabilmente sta bloccando l'accesso ai dati durante il salvataggio automatico. Quindi se il thread principale inserisce un'attesa per accedere ai dati, sei tornato da dove hai iniziato. Quindi crei una coda di modifiche in sospeso o qualcosa del genere e perdi traccia di ciò che sta accadendo. A seconda della complessità delle strutture di dati sottostanti, creare una copia potrebbe anche bloccare il thread principale.

Comunque punto, proverei la tua prima opzione. È rapido, semplice e preciso, e non vedo perché non funzioni.

(Nota: non ho guardato sotto il cofano di Xournal, quindi prendilo con un granello di sale. O un agitatore di sale. O qualcosa del genere)

Puoi spingere la funzionalità di salvataggio automatico su un thread separato? Eseguendo un secondo thread si sarebbe in grado di eseguire il salvataggio in parallelo con la GUI ed evitare la finestra di blocco.

Ho poca esperienza con c, ma penso che questo sito potrebbe aiutare.

Ho avuto una situazione simile in passato ed ecco il modo in cui l'ho risolto (.Net):

  1. Il timer di sfondo passa ad intervalli di x secondi
  2. Al segno di spunta, disabilitare il timer e gestire l'evento appropriato.
  3. Nel gestore eventi, salva e abilita il timer.

L'unico difetto che abbiamo visto effettivamente accadere è stato qualcuno che ha ucciso l'app prima che il gestore dell'evento venisse chiamato e perdesse 1 minuto di lavoro.

Che ne dici di questo?

Usa l'idea di callback ma esegui ogni 10 input oltre a ogni 60 secondi. Con un salvataggio automatico basato sul tempo, c'è un problema che la quantità di cose che si perde è proporzionale alla velocità con cui l'utente può lavorare.

Se si desidera fare un ulteriore passo, è necessario salvare un registro di annullamento parziale su disco dopo ogni modifica oltre al salvataggio completo. In questo modo, la cosa peggiore che può accadere da un incidente è perdere l'ultimo colpo di input.

Il mio obiettivo è quello di utilizzare un thread hipervisor confrontando tramite alcuni algoritmi hash il contenuto del file ogni N secondi all'evento change, quindi notificare al thread parent e richiamare la funzione di salvataggio automatico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top