Pregunta

Estoy escribiendo una aplicación de Windows CE en C ++ aplicación directa del WINAPI. En esta solicitud, analizar un archivo de texto, que puede o no puede ser grande y por lo tanto puede o no puede tomar un tiempo para la carga; y como voy a agregar funcionalidad a través de archivos de carga de la red inalámbrica, pensé que lo mejor sería añadir una barra de progreso.

Mi objetivo es mostrar la barra de progreso en un diálogo modal, lo que impide que el usuario interactúe con la ventana principal. Un hilo es entonces creado para realizar la carga en segundo plano, dejando el hilo principal para actualizar la interfaz gráfica de usuario.

Sin embargo, el uso previene EndDialog() mí volver al código que carga el archivo hasta que el diálogo se ha cerrado. Obviamente quiero mostrar el cuadro de diálogo y después cargar la carga, la actualización periódica de los avances de la rosca de fondo. En este punto, sólo sé de dos opciones para evitar este:

  1. Crear el cuadro de diálogo usando CreateDialog, modificar el controlador de mensajes para dar cabida a los mensajes designados para el diálogo, desactive la ventana principal y, por último, crear el subproceso en segundo plano.
  2. Crear el hilo de fondo en un estado inicial en suspensión, crear el diálogo utilizando DialogBoxParam que pasa a lo largo de la ID del hilo, y cuando la captura de la WM_INITDIALOG reanudar el hilo.

A pesar de que ninguno de estos dos probablemente funcionaría (me estoy inclinando hacia la segunda opción), tengo curiosidad por saber si esta es la forma en que se supone que las barras de progreso para ser manejado en un entorno Windows - o si hay una más delgado manera, más inteligente de hacerlo.

¿Fue útil?

Solución

Usted no tiene que hacer nada particularmente difícil o poco común. Basta con crear el cuadro de diálogo modal con DialogBox() . En el controlador de WM_INITDIALOG de su procedimiento de diálogo, crear el subproceso de fondo para cargar el archivo. A medida que los avances de carga, enviar el PBM_SETPOS mensaje al control de barra de progreso para actualizarlo.

Cuando se complete la carga, EndDialog() llamada para cerrar el cuadro de diálogo. Sin embargo, EndDialog() se debe llamar desde el interior de su procedimiento de diálogo. Así que para hacer eso, es necesario enviar un mensaje ficticio (por ejemplo WM_APP):

DialogBox(..., DlgProc);
// File loading is done and dialog box is gone now
...
INT_PTR CALLBACK DlgProc(HWND hwnd, UINT msg, LPARAM lparam, WPARAM wparam)
{
    switch(msg)
    {
    case WM_INITDIALOG:
        CreateThread(..., LoadingThread, ...);
        return TRUE;

    case WM_APP:
        EndDialog(hwnd);
        return TRUE;
    ...
    }

    return FALSE:
}

DWORD WINAPI LoadingThread(LPVOID param)
{
    // Load the file
    while(!done)
    {
        ...
        SendMessage(hwndProgressBar, PBM_SETPOS, progress, 0);
    }

    SendMessage(hwndDialogBox, WM_APP, 0, 0);
    return 0;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top