Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. using System;
  2. using System.Drawing;
  3. using System.Threading;
  4. using System.Windows.Forms;
  5.  
  6. namespace Recetas.Multithreading.Cap01
  7. {
  8.     public partial class ThreadProgressBar : Form
  9.     {
  10.         private System.ComponentModel.Container components = null;
  11.        
  12.         private Button btnMostrarMensaje;
  13.         private ProgressBar pbrProgreso;
  14.        
  15.         public ThreadProgressBar()
  16.         {
  17.             InitializeComponent();
  18.         }
  19.        
  20.         protected override void Dispose(bool disposing)
  21.         {
  22.             if (disposing)
  23.             {
  24.                 if (components != null)
  25.                 {
  26.                     components.Dispose ();
  27.                 }
  28.             }
  29.            
  30.             base.Dispose (disposing);
  31.         }
  32.        
  33.         private void InitializeComponent ()
  34.         {
  35.             this.FormBorderStyle = FormBorderStyle.FixedDialog;
  36.             this.Load += new EventHandler(frmThreadProgressBar_Load);
  37.             this.MinimizeBox = false;
  38.             this.Name = "FrmThreadProgressBar";
  39.             this.Size = new Size(300, 300);
  40.             this.StartPosition = FormStartPosition.CenterScreen;
  41.            
  42.             btnMostrarMensaje = new Button();
  43.             btnMostrarMensaje.Click += new EventHandler (btnMostrarMensaje_Click);
  44.             btnMostrarMensaje.Location = new Point (13, 13);
  45.             btnMostrarMensaje.Name = "btnMostrarMensaje";            
  46.             btnMostrarMensaje.Size = new Size (120,23);
  47.             btnMostrarMensaje.Text = "Mostrar Mensaje";
  48.            
  49.             // Crea la barra de progreso:
  50.             pbrProgreso = new ProgressBar();
  51.             pbrProgreso.Location = new Point (13, 53);
  52.             pbrProgreso.Name = "pbrProgreso";
  53.            
  54.            
  55.             this.Controls.Add (btnMostrarMensaje);
  56.             this.Controls.Add (pbrProgreso);
  57.         }
  58.        
  59.         // Este método incrementa o decrementa la barra de progreso de
  60.         // forma aleatoria. El propósito es demostrar que podemos
  61.         // usar un thread para otros componentes y la interfaz no se bloquea:
  62.         private void TareaThread()
  63.         {
  64.             int avance;
  65.             int nuevoValor;
  66.             Random aleatorio = new Random();
  67.            
  68.             while (true)
  69.             {
  70.                 avance = pbrProgreso.Step * aleatorio.Next(-1, 2);
  71.                 nuevoValor = pbrProgreso.Value + avance;
  72.                
  73.                 if (nuevoValor > pbrProgreso.Maximum)
  74.                 {
  75.                     nuevoValor = pbrProgreso.Maximum;
  76.                 }
  77.                 else if (nuevoValor < pbrProgreso.Minimum)
  78.                 {
  79.                     nuevoValor = pbrProgreso.Minimum;
  80.                 }
  81.                
  82.                 pbrProgreso.Value = nuevoValor;
  83.                
  84.                 Thread.Sleep (100);
  85.             }
  86.         }
  87.        
  88.         #region Eventos
  89.         // Este método se encarga de mostrar un mensaje cada vez que el
  90.         // botón `btnMostrarMensaje` es activado por parte del usuario.
  91.         // Independiente de que se esté llevando una tarea simultánea en
  92.         // segundo plano el método podrá invocarse sin ninguna restricción:
  93.         private void btnMostrarMensaje_Click(object sender, EventArgs e)
  94.         {
  95.             MessageBox.Show ("Este mensaje es mostrado desde el thread principal.");
  96.         }
  97.         // Cuando el formulario se carga, inmediatamente se crea una instancia
  98.         // de Thread para invocar de forma simultánea el método TareaThread:
  99.         private void frmThreadProgressBar_Load(object sender, EventArgs e)
  100.         {
  101.             Thread thread = new Thread (new ThreadStart(TareaThread));
  102.             thread.IsBackground = true;
  103.             thread.Start();
  104.         }
  105.         #endregion
  106.         public static void Main()
  107.         {
  108.             Application.EnableVisualStyles();
  109.             Application.Run (new ThreadProgressBar());
  110.         }
  111.     }
  112. }