Ejemplo MultiRead: se lee la tabla de la base de datos mediante múltiples subprocesos

Actualización: noviembre 2007

El ejemplo MultiRead muestra cómo utilizar las clases para plantillas de consumidor OLE DB con el fin de leer una tabla de una base de datos mediante múltiples subprocesos.

El ejemplo de atributos MultiRead constituye la versión con atributos de este ejemplo.

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Para generar y ejecutar este ejemplo

  1. Abra el archivo de solución MultiRead.sln.

  2. En el menú Generar, haga clic en Generar.

  3. En el menú Depurar, haga clic en Iniciar sin depurar.

  4. Aparece un cuadro de diálogo de lectura multiproceso en el que debe especificar el número de subprocesos que se utilizarán para leer la tabla. Haga clic en Ejecutar.

  5. El resultado aparecerá como texto en el cuadro de diálogo de lectura multiproceso; por ejemplo, 15 records in 7 ms.

Cómo funciona el ejemplo

El ejemplo contiene la clase CMultiDlg, que se utiliza para mostrar un cuadro de diálogo. En este cuadro de diálogo, el usuario especifica el número de subprocesos que se utilizarán para leer la tabla. Cuando el usuario hace clic en el botón Ejecutar, se realiza una llamada a la función ReadRecords (que reside en el archivo DBRead.h) para abrir la base de datos, la sesión y la tabla, y para crear el número de subprocesos necesarios. A la vez que abre la tabla, la función asigna el valor True a la propiedad DBPROP_CANHOLDROWS, de modo que el proveedor permita al usuario recuperar nuevas filas sin liberar las filas recuperadas previamente. Esta capacidad es necesaria, ya que varios subprocesos pueden recuperar nuevas filas mientras otros continúan procesando las suyas.

En el ejemplo también se muestra cómo extender la clase estándar CRowset mediante la creación de una nueva clase CMyRowset, que se deriva de CRowset, y se agrega la función miembro MoveAndProcess. La rutina de inicio de cada subproceso es la función ReadTable, a la cual se pasa la clase tabla. La función llama a la rutina MoveAndProcess para leer los registros. Tenga en cuenta que la clase de descriptor de acceso CProduct se define de modo que los datos no se recuperen automáticamente en la llamada a MoveNext. De este modo, se evitan conflictos de búfer con los otros subprocesos y no es necesario proteger MoveNext con una sección crítica. La función MoveAndProcess llama a MoveNext y, a continuación, llama a GetDataHere para incluir los datos directamente en una variable local de dicha función. Se llama a ProcessRecord por cada registro recuperado y la función simplemente muestra los valores del registro de forma predeterminada.

Cada subproceso cuenta el número de registros que lee, los cuales se muestran al final en el cuadro de diálogo, junto con un total y el tiempo invertido.

Nota:

En el ejemplo MultiRead se lee el archivo de base de datos MultiRead.mdb. En el código de ejemplo se da por supuesto que este archivo se encuentra en el directorio actual.

Palabras clave

En este ejemplo se muestra el uso de las clases siguientes:

CAccessor, CDataSource, CDBPropSet, CRowset, CSession y CTable

También se usan las siguientes macros:

BEGIN_ACCESSOR_MAP, BEGIN_ACCESSOR, COLUMN_ENTRY, END_ACCESSOR, END_ACCESSOR_MAP y DEFINE_COMMAND

El ejemplo también muestra el uso de las funciones siguientes:

CreateThread, GetCurrentThreadId, GetExitCodeThread y WaitForMultipleObjects

Nota:

Algunos ejemplos, como éste, no se han modificado para reflejar los cambios en los asistentes, las bibliotecas y el compilador de Visual C++, pero, aun así, muestran cómo realizar la tarea deseada.

Vea también

Otros recursos

Ejemplos de ATL