Multithreading: Creación de subprocesos de interfaz de usuario de MFC
Los subprocesos de interfaz de usuario se utilizan normalmente para controlar los datos proporcionados por el usuario y para responder a los eventos de usuario independientemente de los subprocesos que ejecutan otras partes de la aplicación. El subproceso principal de la aplicación (suministrado en la clase derivada de CWinApp
) ya está creado y se inicia automáticamente. Este tema describe los pasos necesarios para crear subprocesos de interfaz de usuario adicionales.
Lo primero que se debe hacer al crear un subproceso de interfaz de usuario es derivar una clase de CWinThread. La clase se debe declarar e implementar mediante las macros DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE. Esta clase debe reemplazar algunas funciones y puede reemplazar otras. Estas funciones, y su cometido, se presentan en la siguiente tabla.
Funciones que se deben reemplazar cuando se crea un subproceso de interfaz de usuario
Función | Propósito |
---|---|
ExitInstance | Realizar tareas de limpieza cuando el subproceso termina. Normalmente, se reemplaza. |
Initinstance | Llevar a cabo la inicialización de la instancia del subproceso. Debe reemplazarse. |
OnIdle | Realizar el procesamiento de los tiempos de inactividad específicos del subproceso. No se suele reemplazar. |
PreTranslateMessage | Filtre los mensajes antes de enviarlos a TranslateMessage y DispatchMessage . No se suele reemplazar. |
ProcessWndProcException | Interceptar las excepciones no controladas producidas por el mensaje del subproceso y activar los controladores. No se suele reemplazar. |
Ejecutar | Función controladora para el subproceso. Contiene la fuente de mensajes. Casi nunca se reemplaza. |
MFC proporciona dos versiones de AfxBeginThread
por medio de sobrecarga de parámetros: una que solo puede crear subprocesos de trabajo y otra que puede crear subprocesos de interfaz de usuario o subprocesos de trabajo. Para iniciar el subproceso de interfaz de usuario, llame a la segunda sobrecarga de AfxBeginThread con la siguiente información:
La RUNTIME_CLASS de la clase que se derivó de
CWinThread
.(Opcional) El nivel de prioridad deseado. El valor predeterminado es la prioridad normal. Para obtener más información acerca de los niveles de prioridad disponibles, vea SetThreadPriority en Windows SDK.
(Opcional) El tamaño de pila deseado para el subproceso. El valor predeterminado para el tamaño de pila es el mismo que el del subproceso creador.
(Opcional) CREATE_SUSPENDED si desea que el subproceso se cree en un estado suspendido. El valor predeterminado es 0, es decir, iniciar el subproceso normalmente.
(Opcional) Los atributos de seguridad deseados. El valor predeterminado es el mismo acceso que el de su subproceso primario. Para obtener más información acerca del formato de esta información de seguridad, vea SECURITY_ATTRIBUTES en Windows SDK.
AfxBeginThread
realiza automáticamente la mayoría del trabajo. Crea un nuevo objeto de la clase, lo inicializa con la información suministrada y llama a CWinThread::CreateThread para empezar a ejecutar el subproceso. Se realizan comprobaciones en todo el procedimiento para asegurar que todos los objetos queden desasignados correctamente en caso de error en algún momento del proceso de creación.