Los foros del Guille

Si no encuentras respuesta, puedes buscar en el sitio del Guille

Google
 

elGuille.hosting: La oferta avanzada:
.NET 2.0, SQL Server, 4000MB, 30GB transf. por 19.95 Eur al mes

Selecciona el foro y pulsa en mostrar:     Mostrar 
De tu interés (algunos de los avisos publicados)

01/abr/2006
Te recuerdo que las fechas mostradas son en formato GMT, osea, es la hora "Universal" (UTC o GMT), algún día de estos haré que se muestre vuestra hora local...

  Foro: .NET.C# Cantidad:  Desde:   Hasta:    Aplicar   Responder 
Respuestas a: 57957 - Problema con Threads y refresco de controles
IDAsuntoFechaNick 
57957 Problema con Threads y refresco de controles25/06/15 07:35drualcman_PH   
He creado una especie de "reloj", lo que hace es en una circunferecia muestra ticks como los de un reloj pero cuenta hacia atras.

Explico un poco, he creado un OCX que realiza las acciones del "reloj", dibujar la circunferencia y la bolita que camina en sentido contrario de las agujas, y he creado unas funciones que cambian los valores o inicia el timer o lo para para el repintado de OCX.

El tema es que funciona genial desde la aplicacion principal. Pero esta aplicacion conecta con una base de datos mediente un proedimiento dentro de Thread.

Primero me lanzaba el error de "Cross-tread operation not valid: Control 'xxx' accessed from a therad other than the thread it was created on." pero esto lo "medio solucione" con el post http://www.elguille.info/NET/vs2005/trucos/acceder_a_un_control_desde_otro_hilo.htm de esta misma web.

Ahora el tema esta en que si no paro el procedimiento poniendo un MessageBox cuando inicio el timer luego la bolita no sigue funcionando, por lo que no es operativo triste

Codigo que lanza el movimiento, es un UserControl.
/// <summary>
/// Start clock
/// </summary>
public void Start()
{
    tiempo.Enabled = true;
   MessageBox.Show("Reloj Iniciado");
}
/// <summary>
/// Stop clock
/// </summary>
public void Stop()
{
    tiempo.Enabled = false;
    //MessageBox.Show("Reloj Parado");
}
/// <summary>
/// Reset counter of seconds
/// Aditional return Segs
/// </summary>
public int ResetSegs
{
    get { return this.segs; }
    set { segs = value; }
}

private void tiempo_Tick(object sender, EventArgs e)
{
    Refresh();
    //MessageBox.Show("Reloj funcionando. Interval = " +
         Convert.ToString(tiempo.Interval));
}

Codigo que llama al reloj desde el formulario principal donde esta introducido el UserControl
private void
     StartClock(string sCommand, string sMinPrice, string
     sStartPrice)
{
    // start clock
    clockRB1.fPriceStop = float.Parse(sMinPrice);

    cThread = new Thread(new ThreadStart(StartMyClock));
    cThread.Start();
            
    pThread = new Thread(new ThreadStart(RunClock));
    pThread.Start();

}

private void StartMyClock()
{
    // start clock
    clockRB1.ResetSegs = 0;
    clockRB1.StartMonitor();
}

Inicialmente esta pensado como OCX para usarlo con una DLL, pero me tenia el mismo problema y, como no sabia que hacer, intente meterlo como UserControl directamente en la aplicacion. Aunque como DLL el error me daba solo por estar agregado.

Si me pueden solucionar cualquiera de los dos problemas mejor, yo prefiero que sea una DLL ya que ese mismo control lo voy a tener que utilizar en distintas aplicaciones del proyecto.

Muchas gracias de antemano.

DrUalcman_PH
Filipinas
IDAsuntoFechaNick 
57960 LA SOLUCION Gracias a Alberto Poblacion (Partner, MVP) (Resp: 57957)26/06/15 07:47drualcman_PH   
He conseguido solucionarlo. Mirar este otro foro en microsoft donde me ayudaron a resolver el problema.

https://social.msdn.microsoft.com/Forums/en-US/42d430e6-200a-43c1-afee-ff8567e6b615/porque-necesito-mostrar-un-cuadro-de-dialogo-messagebox-para-que-el-proceso-continue?forum=vcses

Todo el codigo que modifique para que funcionara
private void Form1_Load(object sender, System.EventArgs e)
{
    // New CLock
    myNewClock = new NewClock(StartNewClock);
    // Finish New Clock
}

private void
     StartClock(string sCommand, string sMinPrice, string
     sStartPrice)
{
       // A este procedimiento se llega desde otro Thread

    clockRB1.fPriceStop = float.Parse(sMinPrice);
    // call to thread for new clock
    myThreadNewClock = new Thread(new ThreadStart(ThreadFunctionNewClock));
    myThreadNewClock.Start();

    pThread = new Thread(new ThreadStart(RunClock));
    pThread.Start();
}

// new clock
public delegate void NewClock();
public NewClock myNewClock;
private Thread myThreadNewClock;

private void StartNewClock()
{
    if (Stopped == false )
    {
        // star clock
        clockRB1.StartMonitor();
    }
    else
    {
        clockRB1.StopMonitor();
    }
}
     
private void ThreadFunctionNewClock()
{
    MyThreadClassNewClock myThreadClassObject = new
         MyThreadClassNewClock(this);
    myThreadClassObject.Run();
}
            
public class MyThreadClassNewClock
{
    Form1 myForm;
    public MyThreadClassNewClock(Form1 myFormDad)
    {
        myForm = myFormDad;
    }

    public void Run()
    {
        // Execute the specified delegate on the thread that owns
        // 'myForm' control's underlying window handle.
        myForm.Invoke(myForm.myNewClock);
    }
}


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57965 Re: LA SOLUCION Gracias a Alberto Poblacion (Partner, MVP) (Resp: 57960)03/07/15 13:24Pipe[hgjfkdls]   
Buena solucion xD

Saludos,

Pipe [hgjfkdls]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.

 
(c) Guillermo 'guille' Som, 2005-2017  - foros.elGuille v1.0.5.3 (23/Mar/2009 14:50 GMT +1)  - (ASP.NET 2.0 v2.0.50727.8762)
 
Usuarios activos: 11 - App. iniciada: 21/11/2017 10:44:15 GMT - La hora GMT del servidor es: 21/11/2017 11:59:47 GMT