none
actualizar formulario en timpo de ejecucion vb.net RRS feed

  • Pregunta

  • buenas tardes: esta es la cuestión, tengo compartido un programa en varias pc supongamos 3, lo que quiero es que por ejemplo en..

    * la pc1 agrego datos y en e form2 se ven esos datos como pantalla,

    *la pc2 tengo siempre ejecutando el programa y tengo el form2 la de pantalla ejecutado en la pc2.....

    la duda como hago par que la pc2 siempre este actualizado lo de la pantalla?????????????????????????????

    solicito sus ayudas gracias!

    jueves, 10 de octubre de 2013 23:57

Todas las respuestas

  • Tendrás que establecer un mecanismo de comunicación entre los dos PCs. Esto puede hacerse de muchas maneras; por ejemplo, podrías establecer una comunicación directa entre ambos usando WCF (Windows Communications Foundation). Para ello, en el PC donde está el formulario que presenta los datos, instanciarías una clase ServiceHost:

    http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost.aspx

    y le pasarías como argumento, además de los parámetros necesarios para establecer la comunicación, una clase nueva escrita dentro de tu proyecto en la que el ServiceHost ejecutará un método cada vez que reciba un mensaje desde el otro PC. Desde ese método "pintarás" los datos oportunos sobre tu Form2 (teniendo en cuenta que el método se ejecuta en otro hilo y por tanto hay que tomar las precauciones habituales en estos casos).

    En el otro PC, el que envía los datos, crearás un cliente WCF para que haga llamadas al que tiene tu ServiceHost cada vez que se necesite actualizar los datos. Esto puede hacerse de varias maneras; tenrás que estudiar algo acerca de WCF ya que es una tecnología de cierta complejidad.

    viernes, 11 de octubre de 2013 6:54
  • Sabes donde podría ver un ejemplo, ? gracias.
    sábado, 12 de octubre de 2013 14:28
  • Escribí precisamente un artículo sobre ese tema, con el ejemplo completo, en la revista DotNetMania número 83 (Junio de 2011). Pero acabo de mirar en su sitio web y, precisamente en ese número, omitieron mi columna en la web. Así que te copio a continuación los fragmentos relevantes de código:

    a) El contrato de WCF, que se necesita en el programa que usan los dos equipos. Dentro declararás las funciones del Form2 que quieras llamar desde el Form1:

    namespace Contrato
    {
        [ServiceContract]
        public interface IFormularioRemoto
        {
            [OperationContract]
            void PresentarFormulario(string texto);
        }
    }
    

    2) La parte servidora (implementada en el Form2), donde inicia al ServiceHost para recibir los mensajes del Form1:

    private void Form1_Load(object sender, EventArgs e)
    {
        Uri direccionBase = new Uri("http://localhost:8000/PresentaFormulario");
        Type tipoImplementacion = typeof(FormularioRemoto);
        host = new ServiceHost(tipoImplementacion, direccionBase);
    
        Type tipoDeContrato = typeof(Contrato.IFormularioRemoto);
        string direccionRelativa = "Presentar";
        host.AddServiceEndpoint(tipoDeContrato, new BasicHttpBinding(), direccionRelativa);
    
        host.Open();
        //Aquí el formulario permanece abierto y el ServiceHost está a la escucha.
    }
    
    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        host.Close();
    }
    

    Para poder abrir el puerto 8000 (o el que escribas en su lugar), esta aplicación requerirá ejecutarse con permisos de administrador (modifica el app.manifest), o bien concederle permisos para usar ese puerto desde las herramientas administrativas de Windows.

    3) La clase que implementa el contrato:

    class FormularioRemoto : Contrato.IFormularioRemoto
    {
        public void PresentarFormulario(string texto)
        {
            SynchronizationContext ctx = SynchronizationContext.Current;
            SendOrPostCallback callback = new SendOrPostCallback(
                delegate(object state)
                {
                    frmEmergente frm = new frmEmergente();
                    frm.Texto = state.ToString();
                    frm.Show();
                });
            ctx.Send(callback, texto);
        }
    }
    

    4) La clase que hace la llamada desde el Form1 (el otro equipo). Evidentemente, donde pone "localhost" habrá que poner la dirección real del equipo al que queremos llamar.

    private void btnAbrirFormEnEquipo2_Click(object sender, EventArgs e)
    {
        EndpointAddress direccion = new EndpointAddress(
            "http://localhost:8000/PresentaFormulario/Presentar");
    
        BasicHttpBinding enlace = new BasicHttpBinding();
    
        Contrato.IFormularioRemoto proxy = 
            ChannelFactory<Contrato.IFormularioRemoto>
                .CreateChannel(enlace, direccion);
    
        proxy.PresentarFormulario(textBox1.Text);
    }
    

    sábado, 12 de octubre de 2013 16:30