
NOTA: Puedes consultar el algoritmo necesario y servirte del código de este link
using System;
using System.Threading;
namespace PangPingPongPung
{
public class Contador
{
const int NUM_HILOS=4;
private int Turno;
private string[] Mensajes={"pang", "ping", "pong", "pung"};
public Contador(int Turno)
{
this.Turno=Turno;
}
public void Incrementar()
{
Turno++;
}
public string ValorActual()
{
return (Turno%NUM_HILOS).ToString();
}
public string MensajeActual()
{
return Mensajes[Turno%NUM_HILOS];
}
}
class Program
{
private Contador c;
const int NUM_HILOS=4;
public Program(int turnoInicial)
{
Thread [] vThreads=new Thread[4];
c=new Contador(turnoInicial);
for (int I=0; I<NUM_HILOS; I++) {
vThreads[I]=new Thread(new ThreadStart(pangpingpongpung));
vThreads[I].Name=I.ToString();
vThreads[I].Start();
if (I<NUM_HILOS-1)
vThreads[I].Join(20);
else
vThreads[I].Join(10000);
}
for (int I=0; I<NUM_HILOS; I++)
vThreads[I].Abort();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
public static void Main(string[] args)
{
Program p=new Program(0);
}
public void pangpingpongpung()
{
while (true) {
Monitor.Enter(c);
try{
if (Thread.CurrentThread.Name==c.ValorActual()) {
Console.WriteLine(c.MensajeActual());
c.Incrementar();
int esperaAleatoria=new Random(
DateTime.Now.Millisecond).Next()%500;
Thread.Sleep(esperaAleatoria);
}
}
finally {
Monitor.Exit(c);
}
}
}
}
}
Archivo default.aspx.cs
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections;
using System.Collections.Specialized;
public partial class _Default : System.Web.UI.Page
{
protected void BtnEnviar_Click(object sender, EventArgs e)
{
EtiRespuesta.Visible = true;
EtiRespuesta.Text = "Hola " + TxtNombre.Text;
Response.Write("Estoy escribiendo con el objeto Response
");
Response.Write("Información del objeto Request " +
Request.Browser.Browser+"
);
// Visualizando la colección de parámetros
// del archivo web.config
NameValueCollection Coleccion;
Coleccion=(NameValueCollection)Context.GetConfig("appSettings");
for (int iCtr = 0; iCtr < Coleccion.Count; iCtr++)
{
String s = Coleccion.Keys[iCtr];
Response.Write(s+" "+Coleccion[s]+"
");
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Cookies["ultimaVisita"] == null)
Response.Write("Es tu primera visita");
else
Response.Write("Tu última visita fue: "+
Request.Cookies["ultimaVisita"].Value);
Response.Cookies["UltimaVisita"].Value=DateTime.Now.ToString();
Response.Cookies["UltimaVisita"].Expires=DateTime.Now.AddMinutes(2);
}
}
public bool WaitToAddElement(object qValue, int waitTime)
{
if(!Monitor.TryEnter(m_inputQueue,waitTime))
return false;
m_inputQueue.Enqueue(qValue);
Monitor.Exit(m_inputQueue);
return true;
}
En cambio, con Enter, el hilo se bloquearía sin condiciones si el recurso está siendo usado por otro hilo.
public void AddElement(object qValue)
{
Monitor.Enter(m_inputQueue);
m_inputQueue.Enqueue(qValue);
Monitor.Exit(m_inputQueue);
}
ANTES:
private Thread myThread;
private void WorkerThread()
{
myThread = Thread.CurrentThread;
while (true)
{
myThread.Suspend();
//Ejecutar tareas
}
}
public void StartWorking()
{
myThread.Resume();
}
***************************************
AHORA:
...private static EventWaitHandle wh;
...
wh = new EventWaitHandle(false,EventResetMode.AutoReset);
...
private void WorkerThread()
{
while(true)
{
wh.WaitOne();
//Ejecutar tareas
}
}
public void StartWorking()
{
wh.Set();
}
public MainForm()
{
OpenFileDialog of = new OpenFileDialog();
of.ShowDialog();
string direccion = of.FileName;
con = new OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0;
Data Source="+direccion+";
Persist Security Info=True");
con.Open();
InitializeComponent();
}
int elementoEncontrado =
bs.Find("Nombre",textBusquedaNombre.Text );
if (elementoEncontrado>=0)
bs.Position = elementoEncontrado;
else MessageBox.Show("Nombre no encontrado");
ds=new DataSet();
OleDbCommand cmd = new OleDbCommand(
"Select Id, Nombre, Edad from Persona",con);
da=new OleDbDataAdapter(cmd);
cb = new OleDbCommandBuilder(da);
da.Fill(ds);
bs=new BindingSource();
bs.DataSource=ds.Tables[0];
dgPersona.DataSource=bs;
Navegador.BindingSource=bs;
void MainFormLoad(object sender, EventArgs e)
{
this.ActualizarGrid();
this.txtNombre.DataBindings.Add(
new Binding("Text",bs,"Nombre",true));
this.mstxtEdad.DataBindings.Add(
new Binding("Text",bs,"Edad",true));
}
// necesitamos una cadena de conexión que variará según el tipo de base de datos a la que nos conectemos.
La cadena de conexión está formada por dos partes: un proveedor y un origen de datos. El proveedor es el motor de base de datos que estamos usando, en este caso un motor Jet de Microsoft. El origen de datos para una base de datos Access es simplemente la trayectoria del fichero .mdb
Ahora usaremos la cadena de conexión para conectarnos y conseguir los datos que queremos.
Ahora veremos como se sincroniza el DataSet con la información de la base de datos a traves del DataGridView:
String sql = "SELECT typeID, Type FROM movietype";
Conexion.Open();
OleDbDataAdapter da = new OleDbDataAdapter(sql, Conexion);
DataTable dt = new DataTable("TiposPeliculas");
da.Fill(dt);
this.ComboTipo.DataSource = dt;
this.ComboTipo.DisplayMember = "Type";
this.ComboTipo.ValueMember = "typeID";
Conexion.Close();
void BtnInsertarClick(object sender, System.EventArgs e)
{
string strTitulo = "";
string strDistribuidor = "";
strTitulo = TextTitulo.Text;
strDistribuidor = TextDistribuidor.Text;
OleDbConnection con = new OleDbConnection
("Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=moviedb.mdb");
con.Open();
OleDbCommand Comando2 = new OleDbCommand(
"Insert into movie (Title, Publisher, typeID)
Values ('" + strTitulo + "', '" + strDistribuidor
+ "',"+ComboTipo.SelectedValue.ToString()+")",con);
Comando2.ExecuteNonQuery();
con.Close();
mostrarDatos();
}
Puedes enlazar un control ComboBox con un objeto DataTable:
using System.Data.SqlClient;
try
{
// Construimos la consulta SQL de selección
String sql = "SELECT IdBanco, Nombre FROM Bancos";
// Creamos un adaptador de datos
OleDbDataAdapter da = new OleDbDataAdapter(sql, cnn);
// Creamos un nuevo objeto DataTable
DataTable dt = new DataTable("Bancos");
// Rellenamos el objeto DataTable
da.Fill(dt);
// Configuramos el control ComboBox
this.comboBox1.DataSource = dt;
this.comboBox1.DisplayMember = "Nombre";
this.comboBox1.ValueMember = "IdBanco";
}
catch (Exception ex) {
MessageBox.Show (ex.Message);
}
}
7.- Ejecuta el proyecto y deberás ver un listado con todas las películas que incluye la base de datos, incluyendo el género.
public void mostrarDatos()
{
Conexion.Open();
Cuadricula.Columns.Clear();
DataTable TablaDatos=new DataTable();
Adaptador.Fill(TablaDatos);
Cuadricula.DataSource=TablaDatos;
Conexion.Close();
}
Decimal cap, tp, res;
String formato = "{0:#,###,###,##0.00}";
try
{
cap = Convert.ToDecimal(Capital.Text);
tp = Convert.ToDecimal(TpInterés.Text);
}
catch (FormatException exc)
{
cap = 0; tp = 0;
}
// Cálculos de los resultados
res = Convert.ToDecimal(cap * tp / 100);
InterésPro.Text = String.Format(formato, res);
res += cap;
CapitalAc.Text = String.Format(formato, res);
1 -> Derecha -1 -> Izquierda 1 -> Abajo -1 -> Arriba 'u' (up) -> arriba 'd' (down) -> abajopor enumerados.
using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace Pong { public partial class MainForm : Form { // 1 -> Derecha -1 -> Izquierda // 1 -> Abajo -1 -> Arriba private int dx = -1, dy = 1; // Variables q contiene la ultima tecla pulsada por cierta pala // para q el rebote se efectue en una o otra direcion // 'u' (up) -> arriba 'd' (down) -> abajo private char d1, d2; public MainForm() { InitializeComponent(); } void reproducirSonido() { System.Media.SoundPlayer player = new System.Media.SoundPlayer(); player.SoundLocation = @"C:\WINDOWS\Media\ding.wav"; player.Play(); } void Timer1Tick(object sender, EventArgs e) { // Movemos la "pelota" pelota.Left += dx; pelota.Top += dy; // Para el movimiento de la pelota //dx = pelota.Location.X >= this.ClientSize.Width ? -1 : dx; //dx = pelota.Location.X == 0 ? 1 : dx; if (pelota.Location.X + 18 >= this.ClientSize.Width) { Timer1.Enabled = false; MessageBox.Show("Gana el jugador 1", "Felicidades"); } if (pelota.Location.X == 0) { Timer1.Enabled = false; MessageBox.Show("Gana el jugador 2", "Felicidades"); } // Si choca contra la parte inferior o el menú dy = pelota.Location.Y + 50 >= this.ClientSize.Width ? -1 : dy; dy = pelota.Location.Y == 25 ? 1 : dy; // Si choca contra la pala1 if (pelota.Left == pala1.Left + pala1.Width) { reproducirSonido(); if (pelota.Top > pala1.Top && pelota.Top < dx =" 1;" dy =" d1" left ="="> pala2.Top && pelota.Top < dx =" -1;" dy =" d2" a =" arriba," z =" abajo" k =" arriba," m =" abajo" top =" 25;" d1 =" 'u';">= this.ClientSize.Height) pala1.Top = this.ClientSize.Height - pala1.Height; d1 = 'd'; break; case 'K': //La pala2 pala2.Top -= 10; if (pala2.Top < top =" 25;" d2 =" 'u';">= this.ClientSize.Height) pala2.Top = this.ClientSize.Height - pala2.Height; d2 = 'd'; break; } } // Las opciones del menú void NuevoToolStripMenuItemClick(object sender, EventArgs e) { Timer1.Enabled = true; pelota.Left = 154; pelota.Top = 134; } void ControlesToolStripMenuItemClick(object sender, EventArgs e) { MessageBox.Show ("Pulsar las teclas A y K para subir y las teclas Z y M para bajar las respectivas paletas de los jugadores 1 y 2", "Controles"); } void SalirToolStripMenuItemClick(object sender, EventArgs e) { Application.Exit(); } } }
namespace Calculadora
{
enum Operacion {suma, resta, multiplicacion, division} ;
public partial class MainForm : Form
{
Operacion oper;
float primero;
public MainForm()
{
InitializeComponent();
}
void Numero7Click(object sender, EventArgs e)
{
txtnum.Text = txtnum.Text + 7;
}
void Numero8Click(object sender, EventArgs e)
{
txtnum.Text = txtnum.Text + 8;
}
void Numero9Click(object sender, EventArgs e)
{
txtnum.Text = txtnum.Text + 9;
}
void Numero4Click(object sender, EventArgs e)
{
txtnum.Text = txtnum.Text + 4;
}
void Numero5Click(object sender, EventArgs e)
{
txtnum.Text = txtnum.Text + 5;
}
void Numero6Click(object sender, EventArgs e)
{
txtnum.Text = txtnum.Text + 6;
}
void Numero1Click(object sender, EventArgs e)
{
txtnum.Text = txtnum.Text + 1;
}
void Numero2Click(object sender, EventArgs e)
{
txtnum.Text = txtnum.Text + 2;
}
void Numero3Click(object sender, EventArgs e)
{
txtnum.Text = txtnum.Text + 3;
}
void Numero0Click(object sender, EventArgs e)
{
txtnum.Text = txtnum.Text + 0;
}
void CClick(object sender, EventArgs e)
{
txtnum.Text = "";
}
void DivClick(object sender, EventArgs e)
{
oper = Operacion.division;
primero = float.Parse (txtnum.Text);
txtnum.Text = "";
}
void MulClick(object sender, EventArgs e)
{
oper = Operacion.multiplicacion;
primero = float.Parse (txtnum.Text);
txtnum.Text = "";
}
void ResClick(object sender, EventArgs e)
{
oper = Operacion.resta;
primero = float.Parse (txtnum.Text);
txtnum.Text = "";
}
void SumClick(object sender, EventArgs e)
{
oper = Operacion.suma;
primero = float.Parse (txtnum.Text);
txtnum.Text = "";
}
void SolClick(object sender, EventArgs e)
{
float segundo = int.Parse (txtnum.Text);
float resultado;
switch (oper)
{
case Operacion.suma:
resultado = primero + segundo;
txtnum.Text = resultado.ToString();
break;
case Operacion.resta:
resultado = primero - segundo;
txtnum.Text = resultado.ToString();
break;
case Operacion.multiplicacion:
resultado = primero * segundo;
txtnum.Text = resultado.ToString();
break;
case Operacion.division:
resultado = primero / segundo;
txtnum.Text = resultado.ToString();
break;
}
}
}
}
MiEmpleado.NombreCambiado +=se le indica al delegado que cuando se produzca el evento NombreCambiado se invoque al método "NotificarCambioNombre", método que respeta la firma declarada por el propio manejador de eventos.
new EjemploDelegados.ActualizacionEventHandler(NotificarCambioNombre);
using System;
namespace EjemploDelegados
{
class Program
{
public static void NotificarCambioNombre(string msg)
{
//imprimos mensaje aviso.
Console.WriteLine("¡El nombre del empleado a cambiado!");
Console.WriteLine(msg);
}
public static void Main(string[] args)
{
Empleado MiEmpleado = new Empleado("Ramiro");
MiEmpleado.NombreCambiado +=
new EjemploDelegados.ActualizacionEventHandler(NotificarCambioNombre);
Console.Write("Nombre empleado: ");
MiEmpleado.setNombre(Console.ReadLine());
Console.Write("Pulsa cualquier tecla para continuar . . . ");
Console.ReadKey(true);
}
}
}
using System;
namespace EjemploDelegados
{
public delegate void ActualizacionEventHandler(string msg);
public class Empleado
{
//atributo
private string Nombre;
//... resto de atributos..
//declaración del evento
public event ActualizacionEventHandler NombreCambiado;
public Empleado(String Nombre)
{
this.Nombre=Nombre;
}
public void setNombre(string s)
{
//actualizar el atributo
string anteriorNombre=this.Nombre;
this.Nombre = s;
//lanzar el evento
this.NombreCambiado("Era "+anteriorNombre+"
y ahora es "+this.Nombre);
}
}
}
La forma más cómoda de conseguirlo es usando herramientas que incluyan un editor visual, como Visual Studio o SharpDevelop.
A pesar de que existen versiones gratuitas de Visual Studio, vamos a ver el caso de SharpDevelop, que necesita un ordenador menos potente y tiene un manejo muy similar.
Cuando entramos a SharpDevelop, diríamos que queremos crear una "nueva solución", y en el menú escogeríamos "Aplicación Windows":
Nos aparecerá un esqueleto de aplicación:
Debajo de la ventana de código hay una pestaña llamada "Diseño", que nos permite acceder al diseñador visual:
Para poder incluir botones y otros elementos visuales, debemos escoger la ventana de "Herramientas" en la parte inferior de la pantalla, y luego el panel "Windows Forms" en esta ventana:
Para incluir un botón, podemos hacer clic en el elemento "Button" del panel izquierdo, y luego hacer un clic en la parte de la ventana en la que queremos que aparezca. De igual modo, podríamos añadir otros elementos.
Por ejemplo, vamos a añadir un botón (Button) y una etiqueta de texto (Label), para hacer un primer programa que cambien el texto de la etiqueta cuando pulsemos el botón.
Las propiedades de cada uno de estos elementos aparecen en la parte derecha, en una nueva ventana. Estas propiedades las podremos cambiar directamente en ese panel, o bien desde código. Algunas de esas propiedades son:
Si queremos que al pulsar el botón cambie el texto, tendremos que modificar el código que corresponde al "evento" de pulsación del botón. Lo conseguimos simplemente haciendo doble clic en el botón, y aparece este texto:
void Button1Click(object sender, EventArgs e)
{
}
Dentro de ese método escribiremos lo que queremos que ocurra al hacer clic en el botón. Por ejemplo, para que el texto de la etiqueta "label1" pase a ser "Hola", haríamos:
void Button1Click(object sender, EventArgs e)
{
label1.Text = "Hola";
}
Ejercicios propuestos: