in

Threads

Last post 11-06-2007 18:54 by srocac. 3 replies.
Page 1 of 1 (4 items)
Sort Posts: Previous Next
  • 11-06-2007 0:08

    • srocac
    • Top 10 Contributor
    • Joined on 04-25-2007
    • Posts 28
    • Points 414

    Threads

     Buenas a todos,

     Resulta a que para una pràctica de la UIB he tenido que hacer un ascensor inteligente, y he decidio hacer los gráficos y la animación con WPF. Y para hacer la práctica he tenido que poner 1 thread (He cogido la idea de: http://msdn2.microsoft.com/es-es/library/7a2f3ay4(VS.80).aspx.) Para que vaya  mirando que acciones tomar segun en que piso se este.

    Para eso tengo dos clases.

    Window1.cs Donde tengo el codebehind del Window.xaml,  y aqui tengo:

    En el evento Load del Window tengo lo siguiente

    Worker workerObject = new Worker();
    Thread workerThread = new Thread(workerObject.DoWork);

    // Start the worker thread.
    workerThread.Start();

     // Loop until worker thread activates.
    while (!workerThread.IsAlive) ;

     

    Un procedimiento que es abrirpuerta que hace lo siguiente:

     private void gespuerta(bool abrir)
    {

    if (abrir) 

     PuertasAbrir.Begin(this); // PuertasAbrir es un Objeto de tipo Storyboard donde tengo metido que se muevan los rectangulitos que hace el efecto de abrir la puerta

    else

     PuertasCerrar.Begin(this); //Idem anterior

    Worker.cs

    El Worker pues sigue el de la web donde el procedimiento DoWork() pues miro que acciones se han de tomar segun el piso que este.

     

    MI PROBLEMA: 

    Desde el DoWork quiero llamar al procedimiento  gespuerta(bool abrir) pero no puedo, ya que me da la excepcion de seguridad que "El subproceso que realiza la llamada no puede obtener acceso a este objeto porque el propietario es otro subproceso".

    la forma en lo que lo he implementado ha sido con un delegado.

    //DECLARACION - INICIO

    public delegate void DelegaAnimacion(bool abrir); 

    DelegaAnimacion DA = new DelegaAnimacion(new Window1().gespuertas); 

    //DECLARACION - FIN

    Cuando dentro del DoWork() pongo DA(true). pues salta la excepcion


    Y no se como hacerlo........

     

    He buscado por internet y he encontrado los siguiente links:

     http://www.elguille.info/NET/vs2005/trucos/acceder_a_un_control_desde_otro_hilo.htm Y existe el problema del INVOKE que con WPF no existe.

    http://www.elguille.info/colabora/NET2005/qrox_fswextendido.htm Aqui no emplea invoque emplea cosas de los threads de colas pero no se como aplicarlo a mi ejemplo 

    El problema de los threads lo encuentro complejo con el tema de los controles, pero lo aplica por seguridad....

    Me podeis ayudar.???

     

    Un saludo 

     




     

     

         

     

    • Post Points: 22
  • 11-06-2007 10:26 In reply to

    Re: Threads

    Hola,

    Veo que con el BackgroundWorker no fue suficiente ;)

    He estado mirando un poco más como funciona el modelo de threads de WPF, en realidad no es tan distinto del de WindowsForms. Aunque no tienes el método Invoke directamente en los controles, tienes el Dispatcher que te permite encolar las peticiones en el thread del UI. Sería algo así como:

    this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new DispatcherOperationCallback(DoWork), null);

    En cualquier caso dale un vistazo al Threading Model de la arquitectura de WPF donde te explica en detalle como funciona así como los distintos problemas que puedes encontrar.

    Saludos,

    Jose.

    Jose Fco Bonnin
    -----------------------
    Coordinador Baleares on .NET
    http://blogs.clearscreen.com/jfbonnin/
    Filed under: ,
    • Post Points: 22
  • 11-06-2007 16:53 In reply to

    • srocac
    • Top 10 Contributor
    • Joined on 04-25-2007
    • Posts 28
    • Points 414

    Re: Threads

    Tienes razon es más complejo del backgroundworker :D, le he echado un vistazo por encima a la pagina y parece perfecta ya comentaré la solución cuando la tenga.

     
    Muchas Gracias.

     

    Nos vemos el viernes .... 

    • Post Points: 5
  • 11-06-2007 18:54 In reply to

    • srocac
    • Top 10 Contributor
    • Joined on 04-25-2007
    • Posts 28
    • Points 414

    Re: Threads

    Buenas,

     Fantastico con el ejemplo de la web ya lo consegui, mi error era hacer delegar el dibujar el movimiento de los ascensores, y lo que tenía que hacer era delegar el core que se encarga de hacer la lógica de subir y bajar.

    Lo que NO tenia que hacer era

    void DoWork()

    {

    While (!salir)

    {

    //Core de hacer los movimentos y que segun la opcion delegar el dibujado de la ventana. 

    Sino:

    void DoWork()

    {

    //Core de hacer los movimientos .....

    if (! salir)
    {
        this.Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle, new DelegaCore(this.DoWork));
    }

    Por su puesto he quitado la clase Worker. 

    Tal y como se pone en la web.

    Ahora solo a sincronizar los storyboards y listo.

     
    Muchas Gracias...

    Para agradecertelo no te hare preguntas  el viernes. :D
     

     

    • Post Points: 5
Page 1 of 1 (4 items)
Baleares on .NET®
Powered by Community Server (Commercial Edition), by Telligent Systems