Compartir a través de


Subprocesamiento múltiple: Crear subprocesos de trabajo

Los subprocesos de trabajo se suelen utilizar con el fin de procesar tareas en segundo plano que no necesiten espera por parte del usuario para continuar usando la aplicación. Tareas como cálculos repetidos e impresión de fondo constituyen buenos ejemplos de subprocesos de trabajo. Este tema describe los pasos necesarios para crear subprocesos de trabajo. Entre los temas se incluyen los siguientes:

  • Iniciar el subproceso

  • Implementar la función controladora

  • Ejemplo

Crear un subproceso de trabajo es una tarea relativamente simple. Sólo se requieren dos pasos para poner el subproceso en funcionamiento: implementar la función controladora e iniciar el subproceso. No es necesario derivar una clase de CWinThread. Puede derivar, si es necesario, una versión especial de CWinThread, pero no lo requiere la mayoría de los subprocesos de trabajo simples. CWinThread puede utilizarse sin modificaciones.

Iniciar el subproceso

Existen dos versiones sobrecargadas de AfxBeginThread: una que solo puede crear subprocesos de trabajo y otra que puede crear subprocesos de interfaz de usuario y subprocesos de trabajo. Para iniciar la ejecución del subproceso de trabajo mediante la primera sobrecarga, llame a AfxBeginThread con la siguiente información:

  • La dirección de la función controladora.

  • El parámetro que se va a pasar a la función controladora.

  • (Opcional) El nivel de prioridad deseado para el subproceso. 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 se desea crear el subproceso en el 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 crea e inicializa un objeto CWinThread automáticamente, lo inicia y devuelve su dirección para poder hacer referencia a él posteriormente. 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.

Implementar la función controladora

La función controladora define el subproceso. Cuando se inicia esta función, se inicia también el subproceso; y cuando se abandona, el subproceso termina. Esta función debería presentar el siguiente prototipo:

UINT MyControllingFunction( LPVOID pParam );

El parámetro tiene un solo valor. El valor que la función recibe en este parámetro es el valor que se pasó al constructor cuando se creó el objeto de subproceso. La función controladora puede interpretar este valor de cualquier manera que elija. Puede tratarlo como valor escalar, como puntero a una estructura que contiene múltiples parámetros, o bien puede pasarlo por alto. Si el parámetro hace referencia a una estructura, ésta se puede utilizar no sólo para pasar datos al subproceso, sino también para recibir datos del subproceso. Si utiliza una estructura de este tipo para devolver datos al llamador, el subproceso debe notificar al llamador cuándo están listos los resultados. Para obtener más información sobre las comunicaciones entre el subproceso de trabajo y el llamador, vea Multithreading: Sugerencias de programación.

Cuando la función termina, debe devolver un valor UINT que indique el motivo de la terminación. Normalmente, este código de salida es 0, el cual indica una terminación correcta, mientras que otros valores indican diferentes tipos de error. No obstante, esto depende de la implementación. Algunos subprocesos pueden mantener contadores de uso de objetos y devolver el valor correspondiente a ese objeto. Para saber la forma en que las aplicaciones pueden recuperar este valor, vea Multithreading: Finalizar subprocesos.

Existen algunas restricciones sobre lo que se puede hacer en un programa con multithreading escrito con la biblioteca MFC. Para obtener una descripción de estas restricciones y otras sugerencias sobre el uso de subprocesos, vea Multithreading: Sugerencias de programación.

Ejemplo de función controladora

El ejemplo siguiente muestra cómo definir una función controladora y utilizarla desde otra parte del programa.

UINT MyThreadProc( LPVOID pParam )
{
    CMyObject* pObject = (CMyObject*)pParam;

    if (pObject == NULL ||
        !pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))
    return 1;   // if pObject is not valid

    // do something with 'pObject'

    return 0;   // thread completed successfully
}

// inside a different function in the program
.
.
.
pNewObject = new CMyObject;
AfxBeginThread(MyThreadProc, pNewObject);
.
.
.

¿Sobre qué desea obtener más información?

Vea también

Conceptos

Subprocesamiento múltiple con C++ y MFC