using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace _03_ThreadSincro { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private int[] numeros = new int[1000]; int iterador; int numero; private void Button1_Click(object sender, EventArgs e) { iterador = 0; numero = 0; //creo Thread t1 = new Thread(this.rellena); Thread t2 = new Thread(this.rellena); Thread t3 = new Thread(this.rellena); Thread t4 = new Thread(this.rellena); Thread t5 = new Thread(this.rellena); //inicializar t1.Start(); t2.Start(); t3.Start(); t4.Start(); t5.Start(); //espera t1.Join(); t2.Join(); t3.Join(); t4.Join(); t5.Join(); for (int i = 0; i < 1000; i++) { Debug.WriteLine(numeros[i]); } } Object o = new object(); private void rellena() { for (int i = 0; i < 200; i++) { lock (o) { numero++; numeros[iterador] = numero; Thread.Sleep(50); iterador++; } } } private void Button2_Click(object sender, EventArgs e) { Thread t1 = new Thread(this.rellenaM); Thread t2 = new Thread(this.leeM); t1.Start(); t2.Start(); } //método asociado al hilo productor private void rellenaM() { for (int i = 999; i >=0 ; i--) { numeros[i] = i; Thread.Sleep(5); } lock(this) Monitor.Pulse(this); } //método asociado al hilo consumidor private void leeM() { lock (this) Monitor.Wait(this); for (int i = 0; i < 1000; i++) { Debug.WriteLine(numeros[i]); } } private void Button3_Click(object sender, EventArgs e) { Thread t1 = new Thread(this.Ping); Thread t2 = new Thread(this.Pong); t1.Start(); t2.Start(); } object o1 = new object(); object o2 = new object(); private void Ping() { for (int i = 0; i < 1000; i++) { lock (o2) Monitor.Pulse(o2); lock (o1) { Monitor.Wait(o1); Debug.WriteLine("ping"); } } } private void Pong() { for (int i = 0; i < 1000; i++) { lock (o1) Monitor.Pulse(o1); lock (o2) { Monitor.Wait(o2); Debug.WriteLine("PONG"); } } } private void Button4_Click(object sender, EventArgs e) { iterador = 0; numero = 0; //creo Thread t1 = new Thread(this.rellena); Thread t2 = new Thread(this.rellena); Thread t3 = new Thread(this.rellena); Thread t4 = new Thread(this.rellena); Thread t5 = new Thread(this.rellena); t1.IsBackground = true; t2.IsBackground = true; t3.IsBackground = true; t4.IsBackground = true; t5.IsBackground = true; //inicializar t1.Start(); t2.Start(); t3.Start(); t4.Start(); t5.Start(); Debug.WriteLine(t1.ThreadState.ToString()); Thread.Sleep(200); if (t1.IsAlive) Debug.WriteLine("xxxxxxxxxxxxxx"); t1.Abort(); if (t1.IsAlive) Debug.WriteLine("yyyyyyyyyyyyy"); } private void Button5_Click(object sender, EventArgs e) { //de esta forma no funcionaría //Thread t1 = new Thread(this.EscribeText1); //t1.Start(); Thread t1 = new Thread(this.EscribeText2); t1.Start(); } private void EscribeText1() { this.textBox1.Text = "Hola"; } delegate void DelegadoText(); delegate void DelegadoTextParametros(string s); private void EscribeText2() { //invocación delegado sin parámetros DelegadoText dc1 = new DelegadoText(this.Escribir); this.Invoke(dc1); //invocación a un delgado con parámetros DelegadoTextParametros dc2 = new DelegadoTextParametros(this.Escribir2); this.Invoke(dc2, "hola con parámetros"); } private void Escribir() { this.textBox1.Text = "TEXTO"; } private void Escribir2(string s) { this.textBox2.Text = s; } } }