• Domingo 22 de Diciembre de 2024, 13:56

Autor Tema:  Bloqueo de la aplicación usando System.Threads  (Leído 1259 veces)

Dev_NIX

  • Nuevo Miembro
  • *
  • Mensajes: 6
  • Nacionalidad: es
  • ¡Deja de comerte la masa de las croquetas!
    • Ver Perfil
    • Dadme algún motivo para escribir
Bloqueo de la aplicación usando System.Threads
« en: Martes 25 de Octubre de 2011, 07:10 »
0
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?  :ayuda:

El código es el siguiente:
Código: C#
  1. using System;
  2. using System.IO;
  3. using System.Collections;
  4. using System.Threading;
  5. using Gtk;
  6.  
  7. public partial class MainWindow : Gtk.Window
  8. {
  9.         public MainWindow () : base(Gtk.WindowType.Toplevel)
  10.         {
  11.                 Build ();
  12.         }
  13.  
  14.         protected void OnDeleteEvent (object sender, DeleteEventArgs a)
  15.         {
  16.                 a.RetVal = true;
  17.                 Application.Quit();
  18.         }
  19.  
  20.         protected virtual void menu_exit (object sender, System.EventArgs e)
  21.         {
  22.                 Application.Quit();
  23.                
  24.         }
  25.        
  26.         protected virtual void open_file (object sender, System.EventArgs e)
  27.         {
  28.                 FileChooserDialog fc = new Gtk.FileChooserDialog(
  29.                         "Elija el archivo a abrir",
  30.                 this,
  31.             FileChooserAction.Open,
  32.             "Cancelar",ResponseType.Cancel,
  33.             "Abrir",ResponseType.Accept
  34.                 );
  35.                
  36.                 if (fc.Run() == (int)ResponseType.Accept){                      // Si se ha seleccionado el archivo...
  37.                         System.IO.StreamReader file = new System.IO.StreamReader(fc.Filename);
  38.                        
  39.                         this.textview1.Buffer.Text = file.ReadToEnd();
  40.                         file.Close();
  41.                        
  42.                         // Creamos el hilo para comprobar si el archivo fue modificado
  43.                         Thread checkFileDate1 = new Thread(() => checkFileDate(fc.Filename));
  44.                         //Thread checkFileDate1 = new Thread(new ThreadStart(checkFileDate));
  45.                         checkFileDate1.Start();
  46.                 }
  47.                
  48.                 fc.Destroy();
  49.         }
  50.        
  51.         // Esto se encarga de comprobar si los ficheros abiertos han sido cambiados
  52.  
  53.         public void checkFileDate(string file)
  54.         {
  55.                 DateTime lastDate = System.IO.File.GetLastWriteTime(file);
  56.                 while(true){
  57.                         int result = DateTime.Compare(lastDate, System.IO.File.GetLastWriteTime(file));
  58.                        
  59.                         if (result >= 0){
  60.                                 MessageDialog alert = new MessageDialog (
  61.                                         this,
  62.                         DialogFlags.DestroyWithParent,
  63.                                         MessageType.Info,
  64.                                         ButtonsType.Ok,
  65.                                         "¡El archivo ha sido modificado!"
  66.                                 );
  67.                                        
  68.                                 alert.Run();
  69.                                 alert.Destroy();
  70.  
  71.                                 //MessageBox.Show("¡El archivo ha sido modificado!");
  72.                         }
  73.                        
  74.                         Thread.Sleep(5000);
  75.                 }
  76.         }
  77. }
  78.  
  79.  

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!
« última modificación: Martes 25 de Octubre de 2011, 08:51 por Dev_NIX »