none
Problema hilo "thread" RRS feed

  • Pregunta

  • Hola que tal, tengo un problema con un hilo, haber si lo puedo explicar.Todas las variables las tengo declaradas de forma global. Yo he creado un hilo trabajador como el siguiente:

    UINT ProcesamientoHilo(LPVOID pParam)
    {
        CProgressCtrl *pBar=(CProgressCtrl *)((CPruebaApp*)AfxGetApp())->m_pMainWnd;
           
        if(VH0==1)
        {
            do{
                CapturaPos();
                }while(VH0==49);
        }
     
        }
        //Se manda un mensaje indicando que el hilo trabajador ha terminado.
        ::PostMessage((HWND) pParam,WM_HILO_TERMINADO,0,0);
        return 0;
    }

    LLega un momento en mi programa que yo llamo al hilo de la siguiente manera:

    CWinThread* pHilo=AfxBeginThread(ProcesamientoHilo, Null ,THREAD_PRIORITY_NORMAL);

    Y CapturarPos es la siguiente función:

    void CapturaPos(){

    Robot->RegPositionGrpXyzWpr_SetX(1,x);

    }

    Pues el problema es que cuando llamo al hilo, y el hilo llama a CapturaPos el programa me da un error y se cierra. He probado por ejemplo en CapturaPos el que se me muestre un mensaje y esto si que lo hace bien, no me da ningun problema, pero no se por que si lo llamo de la forma anterior se me cierra el programa. Si alguien me puede echar una mano lo agradeceria.

    Un saludo y gracias
    miércoles, 19 de enero de 2011 17:54

Todas las respuestas

  • Creo que tu problema está en que no puedes acceder a las ventanas desde el hilo. Es decir, cuando quieras actualizar algo de alguna ventana, o bien le envías en mensaje a la ventana desde el hilo, o bien te lo envías a ti mismo a tu bulce de mensajes y entonces actualizas.

    Tienes una función especial, PostThreadMessage(), que envía un mensaje a otro thread y vuelve inmediatamente. En este caso asegurate de que cuando la otra ventana vaya a atender tu mensaje, los datos sigan siendo válidos.

    http://msdn.microsoft.com/en-us/library/ms644946(v=vs.85).aspx

     


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    jueves, 20 de enero de 2011 15:49
    Moderador
  • ¿Que diferencia existe entre PostThreadMessage() y ThreadMessage()?

    He conseguido trabajar utilizando PostMessage de la siguiente manera, en un momento determinado del hilo pongo esto cuando se da una condicion, no estoy seguro de que son los dos ultimos valores que le paso a PostMessage, los dos ceros.

    ::PostMessage((HWND) pParam,WM_HILO_HORIZONTAL_POS,0,0);

    y me ejecuta lo que tengo en lo que pongo a continuación que son dos funciones

    LONG CPruebaDlg::OnHiloHorizontalPos(UINT wParam,LONG lParam)
    {
        CapturaPos();
        Derecha();
        return 0;
    }

    Pero a continuacion si pongo otro PostMessage, que se ejecuta si se da otra condicion.

    ::PostMessage((HWND) pParam,WM_HILO_HORIZONTAL_NEG,0,0);

    Pero no consigo que se ejecute lo que que tengo a continuación, no se si es por que no vuelve del primer mensaje o por que es.

    LONG CPruebaDlg::OnHiloHorizontalNeg(UINT wParam,LONG lParam)
    {
        CapturaPos();
        Izquierda();
        return 0;
    }

    ¿Que diferencia existe entre PostThreadMessage() y ThreadMessage()?

    En el PostThreadMessage() no consigo entender cual es el primer parametro idThread

    PostThreadMessage(
    __in  DWORD idThread,
    __in  UINT Msg,
    __in  WPARAM wParam,
    __in  LPARAM lParam
    );

     

     

    miércoles, 9 de febrero de 2011 10:18
  • Bueno, ya he conseguido solucionar el problema,  muchas gracias.
    jueves, 10 de febrero de 2011 11:13
  • Te respondo, aunque tarde.

    La diferencia está en que PostThreadMessage no espera a que el mensaje se procese, por lo que lo envía y retorna, continuando el funcionamiento del hilo que lo envió.

    La otra espera a que el mensaje se procese, bloqueando el hilo llamante.

    Eso te da juego para hacer varias cosas. Por ejemplo, si lo que quieres es enviarle al hilo principal un mensaje para que actualice la ventana, pues usas Post y el hilo seguirá a lo suyo, pero si te interesa por ejemplo que tu hilo no siga por algún motivo hasta que el otro hilo (al que le envías el mensaje) haga algo, usas la segunda.


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    viernes, 11 de febrero de 2011 17:02
    Moderador