Buenas!
Estoy siguiendo con el programilla del principio. Consiste en un editor de textos básico, al cual le quiero ir metiendo características poco a poco. Una de ellas es que compruebe si un archivo que tenemos abierto ha sido modificado por otro programa, para preguntar si se quiere cargar el nuevo archivo o no, de momento solo quiero que me muestre una alerta, y más adelante daré la opción de recargar.
La idea es que lo compruebe en un hilo ejecutado cada cinco segundos, lo que hago es contrastar la fecha de modificación actual del archivo con la fecha de modificación al abrirlo con mi editor.
El problema es que sin comerlo ni beberlo, en lo que abro el archivo me saca la alerta, y se queda el programa colgado... ¿Alguien ha trabajado con hilos antes?
El código es el siguiente:
using System;
using System.IO;
using System.Collections;
using System.Threading;
using Gtk;
public partial class MainWindow : Gtk.Window
{
public MainWindow () : base(Gtk.WindowType.Toplevel)
{
Build ();
}
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
a.RetVal = true;
Application.Quit();
}
protected virtual void menu_exit (object sender, System.EventArgs e)
{
Application.Quit();
}
protected virtual void open_file (object sender, System.EventArgs e)
{
FileChooserDialog fc
= new Gtk
.FileChooserDialog( "Elija el archivo a abrir",
this,
FileChooserAction.Open,
"Cancelar",ResponseType.Cancel,
"Abrir",ResponseType.Accept
);
if (fc.Run() == (int)ResponseType.Accept){ // Si se ha seleccionado el archivo...
System.IO.StreamReader file
= new System.IO.StreamReader(fc
.Filename);
this.textview1.Buffer.Text = file.ReadToEnd();
file.Close();
// Creamos el hilo para comprobar si el archivo fue modificado
Thread checkFileDate1
= new Thread
(() => checkFileDate
(fc
.Filename)); //Thread checkFileDate1 = new Thread(new ThreadStart(checkFileDate));
checkFileDate1.Start();
}
fc.Destroy();
}
// Esto se encarga de comprobar si los ficheros abiertos han sido cambiados
public void checkFileDate(string file)
{
DateTime lastDate = System.IO.File.GetLastWriteTime(file);
while(true){
int result = DateTime.Compare(lastDate, System.IO.File.GetLastWriteTime(file));
if (result >= 0){
MessageDialog alert
= new MessageDialog
( this,
DialogFlags.DestroyWithParent,
MessageType.Info,
ButtonsType.Ok,
"¡El archivo ha sido modificado!"
);
alert.Run();
alert.Destroy();
//MessageBox.Show("¡El archivo ha sido modificado!");
}
Thread.Sleep(5000);
}
}
}
Destacar que utilizo GTK# en vez de los Winforms porque quiero que la aplicación sea multiplataforma, igual no os suenan cosas como FileChooserDialog o MessageDialog pero bueno, se entienden y no tienen mucho que ver con el problema...
¡Un saludo, a ver en qué termina esto!