MultiRead, exemple d'attributs : lit une table de base de données en utilisant plusieurs threads
Mise à jour : novembre 2007
L'exemple d'attributs MultiRead montre comment utiliser les classes de modèles du consommateur OLE DB pour lire une table dans une base de données en utilisant plusieurs threads.
L'exemple MultiRead est la version sans attributs de cet exemple.
Note de sécurité : |
---|
Cet exemple de code est fourni pour illustrer un concept et ne doit pas être utilisé dans des applications ou des sites Web, car il peut ne pas illustrer les pratiques de programmation les plus sûres. Microsoft n'assume aucune responsabilité pour tout dommage indirect ou consécutif en cas d'utilisation de l'exemple de code à des fins autres que celles prévues. |
Pour obtenir des exemples et des instructions d'installation :
Dans le menu ? (Aide) de Visual Studio, cliquez sur Exemples.
Pour plus d'informations, consultez Recherche des fichiers d'exemple.
La liste la plus récente et la plus complète d'exemples est disponible en ligne à partir de la page Visual Studio 2008 Samples.
Des exemples sont également disponibles sur le disque dur de votre ordinateur. Des exemples et un fichier Readme sont stockés par défaut dans un dossier sous \Program Files\Visual Studio 9.0\Samples\. Pour les éditions Express de Visual Studio, tous les exemples sont disponibles en ligne.
Génération et exécution de l'exemple
Ouvrez le fichier solution MultiRead.sln.
Dans le menu Générer, cliquez sur Générer.
Dans le menu Déboguer, cliquez sur Exécuter sans débogage.
Une boîte de dialogue de lecture multithread s'affiche, vous demandant de spécifier le nombre de threads à utiliser pour lire la table. Cliquez sur Exécuter.
Le résultat s'affiche sous forme de texte dans la boîte de dialogue de lecture multithread ; par exemple, 15 records in 7 ms.
Fonctionnement de l'exemple
Cet exemple contient la classe CMultiDlg qui permet d'afficher une boîte de dialogue. À l'aide de cette boîte de dialogue, l'utilisateur entre le nombre de threads à utiliser pour lire la table. Lorsque l'utilisateur clique sur le bouton Exécuter, ReadRecords dans DBRead.h est appelé pour ouvrir la base de données, la session et la table, ainsi que pour créer le nombre de threads nécessaires. Au moment où elle ouvre la table, cette fonction affecte la valeur True à la propriété DBPROP_CANHOLDROWS pour que le fournisseur permette à l'utilisateur de récupérer de nouvelles lignes sans pour autant libérer les lignes récupérées précédemment. Cette fonctionnalité est requise, parce que plusieurs threads récupèrent de nouvelles lignes pendant que d'autres continuent le traitement des lignes en cours.
Cet exemple montre également comment étendre la classe CRowset standard en créant une classe CMyRowset, dérivée de CRowset, et ajoute la fonction membre MoveAndProcess. La routine de démarrage de chaque thread est la fonction ReadTable et la classe table est passée à cette fonction. La fonction appelle la routine MoveAndProcess pour lire chaque enregistrement. Notez que la classe d'accesseur CProduct est définie de telle sorte que les données ne soient pas récupérées automatiquement lors de l'appel à MoveNext. Cela évite des conflits de mémoire tampon avec d'autres threads et permet de ne pas protéger MoveNext avec une section critique. La fonction MoveAndProcess appelle MoveNext, puis appelle GetDataHere pour placer directement les données dans une variable locale de cette fonction. ProcessRecord est appelé pour chaque enregistrement récupéré et la fonction trace simplement les valeurs de l'enregistrement par défaut.
Chaque thread compte le nombre d'enregistrements lus, lesquels sont analysés à la fin ; ce nombre, ainsi que le total et le temps requis, sont affichés dans la boîte de dialogue.
Remarque : |
---|
L'exemple MultiRead lit le fichier de base de données MultiRead.mdb. L'exemple de code considère que ce fichier se trouve dans le répertoire actif. |
Attributs
Cet exemple utilise les attributs suivants :
db_column, db_source, db_table, exe, helpstring, module, name, threading, uuid, version
Mots clés
Cet exemple illustre l'utilisation des classes suivantes :
CAccessor, CDataSource, CDBPropSet, CRowset, CSession, CTable
Cet exemple illustre l'utilisation des macros suivantes :
BEGIN_ACCESSOR_MAP, BEGIN_ACCESSOR, COLUMN_ENTRY, END_ACCESSOR, END_ACCESSOR_MAP, DEFINE_COMMAND
Cet exemple illustre l'utilisation des fonctions suivantes :
CreateThread, GetCurrentThreadId, GetExitCodeThread, WaitForMultipleObjects
Remarque : |
---|
Certains exemples, tels que celui-ci, n'ont pas été modifiés pour refléter les changements apportés aux Assistants, aux bibliothèques et au compilateur Visual C++, mais ils illustrent bien l'exécution de la tâche souhaitée. |