C/Visual C - Thread y ventana de dialogo

 
Vista:

Thread y ventana de dialogo

Publicado por josu (3 intervenciones) el 26/03/2003 17:03:32
Hola... soy nuevo en visual c++ y tengo la siqguiente duda.

Como puedo controlar (por ejemplo) un progress bar situada en una ventana de dialogo desde un thread.????
El thread lo creo en la misma ventana de dialogo de la siguiente forma:

void CControl::OnButtonHilos()
{
CWinThread * mThread1 = AfxBeginThread(CHilo1::MyThreadFunction,(LPVOID)&mControl);

}

Tengo una estructara para controlar el theead asi:
struct MyThreadStruct
{
unsigned progAmt;
bool abort;
HWND hwndStatic;
int tipo;
};

y la funcion del thread es el siguiente:

UINT CHilo1::MyThreadFunction(LPVOID param)
{
MyThreadStruct* info = (MyThreadStruct*)param;

while (TRUE)
{
//aqui me gustaria acceder al progress bar e ir controlandolo con /
// una variable o lo que sea

return (0);
}

Un saludo de antemano al que se haya leido todo esto y gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Controlar un progress bar desde un hilo en un diálogo

Publicado por Alejandro (1153 intervenciones) el 13/05/2025 17:56:23
Para controlar un `Progress Bar` desde un hilo en Visual C++, necesitas asegurarte de que las actualizaciones de la interfaz de usuario se realicen en el hilo principal de la aplicación, ya que la mayoría de los controles de la interfaz de usuario no son seguros para hilos. Aquí te muestro cómo puedes hacerlo:

1. Definir el progress bar en tu diálogo:


Asegúrate de que tienes un `CProgressCtrl` en tu diálogo y que lo has inicializado correctamente.

2. Enviar mensajes desde el hilo:


Puedes usar `PostMessage` o `SendMessage` para enviar mensajes desde tu hilo al hilo principal, que actualizará el `Progress Bar`. Aquí hay un ejemplo de cómo hacerlo:

3. Modificar tu estructura:


Asegúrate de que tu estructura `MyThreadStruct` tenga un identificador para el `Progress Bar`:

1
2
3
4
5
6
7
struct MyThreadStruct
{
    unsigned progAmt;
    bool abort;
    HWND hwndProgress; // Cambiado a HWND para el progress bar
    int tipo;
};

4. Actualizar el progress bar en el hilo:


Dentro de tu función de hilo, puedes enviar un mensaje al hilo principal para actualizar el `Progress Bar`:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
UINT CHilo1::MyThreadFunction(LPVOID param)
{
    MyThreadStruct* info = (MyThreadStruct*)param;
 
    for (unsigned i = 0; i <= 100; i++) // Simulando progreso
    {
        // Aquí puedes realizar tu trabajo en el hilo
 
        // Enviar un mensaje al hilo principal para actualizar el progress bar
        PostMessage(info->hwndProgress, WM_USER + 1, i, 0);
 
        // Simular un retraso
        Sleep(100); // Simula trabajo
    }
 
    return 0;
}

5. Manejar el mensaje en el diálogo:


En tu clase de diálogo, debes manejar el mensaje que enviaste desde el hilo para actualizar el `Progress Bar`:

1
2
3
4
5
6
7
8
9
10
BEGIN_MESSAGE_MAP(CControl, CDialogEx)
    ON_MESSAGE(WM_USER + 1, &CControl::OnUpdateProgress)
END_MESSAGE_MAP()
 
LRESULT CControl::OnUpdateProgress(WPARAM wParam, LPARAM lParam)
{
    // Actualizar el progress bar
    m_progressBar.SetPos(static_cast<int>(wParam)); // wParam contiene el valor del progreso
    return 0;
}

6. Inicializar el progress bar:
Asegúrate de inicializar el `Progress Bar` en tu diálogo, por ejemplo, en `OnInitDialog()`:

1
2
3
4
5
6
7
8
9
10
BOOL CControl::OnInitDialog()
{
    CDialogEx::OnInitDialog();
 
    // Inicializar el progress bar
    m_progressBar.SetRange(0, 100);
    m_progressBar.SetPos(0);
 
    return TRUE; // return TRUE unless you set the focus to a control
}

Conclusión:


Con estos pasos, deberías poder controlar un `Progress Bar` desde un hilo en Visual C++. Recuerda que todas las actualizaciones de la interfaz de usuario deben hacerse en el hilo principal, y el uso de `PostMessage` es una forma efectiva de comunicarte entre hilos. ¡Buena suerte con tu proyecto, Josu!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar