Pregunta

He estado pirateando el código de Xournal para agregar la funcionalidad de guardado automático. Mi implementación inicial fue muy tonta: cada 60 segundos, haga un ahorro. La característica aparentemente funciona.

Sin embargo, después de probarlo durante un tiempo, me di cuenta de que cuando se ejecuta el guardado automático, la aplicación se congela temporalmente, lo que es bastante molesto si estás en medio de un trazo de lápiz. Estoy tratando de descubrir cómo solucionar esto.

Una posibilidad que he pensado es que el autoguardado verifique si el lápiz toca o no la pantalla antes de guardarlo automáticamente; si se toca, adjunte una devolución de llamada de una sola vez programada para un segundo después de levantar el bolígrafo. (si sucede lo mismo, repita). Otra posibilidad sería optimizar la función de guardar lo suficiente como para que no haya espacio (parece poco probable).

¿Alguien tiene alguna sugerencia sobre esto? Xournal utiliza el kit de herramientas Gnome / GTK y está escrito en C.

Actualización: implementé la lógica anti-clobber, y estoy muy contento con la granularidad y el rendimiento del autoguardado resultante. Una de esas veces los hilos son (afortunadamente) no necesarios! Gracias a todos por sus sugerencias.

¿Fue útil?

Solución

Si la interfaz de usuario se congela por un período de tiempo notable, un hilo separado es probablemente el camino a seguir. Si la única razón por la que está notando la congelación de la interfaz de usuario es porque está escribiendo en ese momento y la interrupción es muy breve, entonces su método podría funcionar. Su solución probablemente sea mucho más fácil que crear otro hilo, así que intente eso primero.

Si terminas usando hilos, ve con g_threads en lugar de pthreads ya que estás usando GTK +. Serán más portátiles.

Otros consejos

Si bien estaría de acuerdo con el uso de hilos es un " correcto " respuesta del cuadro de texto, no siempre es la forma de hacer las cosas. El subprocesamiento múltiple tiende a generar toneladas de problemas si no tiene cuidado: el principal aquí probablemente sea bloquear el acceso a los datos durante el autoguardado. Luego, si el hilo principal entra en espera para acceder a los datos, está de vuelta donde comenzó. Entonces creas una cola de cambios pendientes o algo así, y pierdes la noción de lo que está sucediendo. Dependiendo de cuán complejas sean las estructuras de datos subyacentes, hacer una copia también podría congelar el hilo principal.

En cualquier caso , quiero probar su primera opción. Es rápido, simple y directo, y no veo por qué no funcionaría.

(Nota: no he mirado bajo el capó de Xournal, así que tómalo con un grano de sal. O un salero. O algo así)

¿Puede empujar la funcionalidad de autoguardado a un hilo separado? Al ejecutar un segundo subproceso, podrá ejecutar el guardado en paralelo con la interfaz gráfica de usuario y evitará la ventana de congelación.

Tengo muy poca experiencia con c, pero creo que este sitio podría ayudar.

He tenido una situación similar en el pasado y así es como la resolví (.Net):

  1. El temporizador de fondo marca a intervalos de x segundos
  2. En la marca, desactive el temporizador y maneje el evento apropiado.
  3. En el controlador de eventos, guarde y habilite el temporizador.

El único defecto que hemos visto en realidad fue que alguien cerró la aplicación antes de que se llamara al controlador de eventos y perdiera 1 minuto de trabajo.

¿Qué tal esto?

Utilice la idea de devolución de llamada, pero haga que se ejecute cada 10 entradas además de cada 60 segundos. Con un autoguardado basado en el tiempo, existe el problema de que la cantidad de cosas que se pierden es proporcional a la rapidez con que el usuario puede trabajar.

Si desea ir un paso más allá, haga que guarde un registro de deshacer parcial en el disco después de cada cambio, además del guardado completo. De esa manera, lo peor que puede suceder por un bloqueo es perder el último trazo de entrada.

Mi objetivo es utilizar un subproceso hipervisor comparando a través de algún algoritmo hash el contenido del archivo cada N segundos en caso de cambio y luego notificar al subproceso principal y devolver la llamada a la función de guardado automático.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top