MultiRead-Beispiel: Liest eine Datenbanktabelle mithilfe mehrerer Threads
Das MultiRead-Beispiel veranschaulicht die OLE DB-Consumervorlagen-Klassen zum Lesen einer Tabelle in einer Datenbank mithilfe mehrerer Threads verwenden.
MultiRead-Attribute Beispiel ist die attributierte Version dieses Beispiels.
Sicherheitshinweis |
---|
Dieser Beispielcode soll ein Konzept veranschaulichen, und es wird nur den Code, der für dieses Konzept relevant sind. Möglicherweise erfüllt dieser nicht die Sicherheitsanforderungen für eine bestimmte Umgebung, und er sollte nicht genau wie dargestellt verwendet werden. Wir empfehlen, Sicherheits- und Fehlerbehandlungscode hinzuzufügen, um Ihre Projekte sicherer und stabiler zu machen. Microsoft stellt diesen Beispielcode "Wie besehen"keine Garantien. |
So erhalten Sie Beispiele und Anweisungen für deren Installation:
Um Beispiele von Visual Studio zuzugreifen
im Menü Hilfe Menü klicken Beispiele.
Standardmäßig sind die Beispiele in installiert. Laufwerk: \Programme\Microsoft visual Studio 10.0\Samples\.
- Die neueste Version dieses Beispiels und eine Liste der anderen Beispiele finden Sie unter Visual Studio Samples auf der MSDN-Website.
Erstellen und Ausführen des Beispiels
So erstellen und in diesem Beispiel führen
Öffnen Sie die Projektmappendatei MultiRead.sln.
erstellen Sie Menü, klicken Sie auf erstellen.
Debuggen Sie von Menü, klicken Sie auf Starten ohne Debuggen.
Ein Dialogfeld Multi-Thread lesen wird angezeigt, Sie aufgefordert werden, die Anzahl der zum Lesen der Tabelle zu verwendenden Threads angeben. Klicken Sie auf ausführen.
Das Ergebnis wird in das Dialogfeld Multi-Thread lesen, z. B. 15 records in 7 ms als Text angezeigt.
Funktionsweise des Beispiels
Das Beispiel enthält die CMultiDlg-Klasse, die zum Anzeigen eines Dialogfelds verwendet wird. Mit diesem Dialogfeld gibt der Benutzer die Anzahl der zum Lesen der Tabelle zu verwendenden Threads. Klickt der Benutzer die Schaltfläche ausführen ist ReadRecords in DBRead.h aufgerufen, zum Öffnen der Datenbank, die Sitzung und der Tabelle sowie die notwendige Anzahl von Threads zu erstellen. Wenn diese die Tabelle geöffnet wird, legt die Funktion die DBPROP_CANHOLDROWS-Eigenschaft auf True festgelegt, sodass der Anbieter dem Benutzer das Abrufen neuer Zeilen ohne Freigabe der zuvor abgerufenen Zeilen ermöglicht. Diese Funktion ist erforderlich, da mehrere Threads neue Zeilen abrufen, während andere Threads noch Ihrer aktuellen Threads verarbeitet werden.
Das Beispiel zeigt auch, wie die standard CRowset -Klasse erweitert, indem Sie eine neue CMyRowset -Klasse, die von CRowsetabgeleitet ist und fügt die MoveAndProcess-Memberfunktion hinzu erstellen. Die Routine Starten jedes Threads ist die Funktion ReadTable und die Tabellenklasse an diese Funktion übergeben wird. Die Funktion ruft die Routine MoveAndProcess durch jeden Datensatz lesen. Beachten Sie, dass Accessor Klasse CProduct definiert ist, so, dass die Daten nicht automatisch für den Aufruf MoveNext abgerufen werden. Dadurch werden Puffer Konflikte mit anderen Threads vermieden, und es ist keine Notwendigkeit, MoveNext mit einem kritischen Abschnitt zu schützen. Die Funktion MoveAndProcessMoveNextaufruft und ruft dann GetDataHere, um die Daten direkt in einer lokalen Variablen dieser Funktion zu platzieren. ProcessRecord heißt für jeden abgerufenen Datensatz, und die Funktion verfolgt einfach standardmäßig die Werte des Datensatzes.
Jeder Thread zählt die Anzahl der Datensätze liest und diese werden am Ende zusammen mit der Summe und Zeit, die im Dialogfeld angezeigt wird verfolgt.
Hinweis
Das MultiRead-Beispiel liest die Datenbankdatei MultiRead.mdb.Der Beispielcode wird davon ausgegangen, dass diese Datei im aktuellen Verzeichnis befindet.
Schlüsselwörter
Dieses Beispiel demonstriert die folgenden Klassen:
CAccessor, CDataSource, CDBPropSet, CRowset, CSession, CTable
Dieses Beispiel demonstriert die folgenden Makros:
BEGIN_ACCESSOR_MAP , BEGIN_ACCESSOR, COLUMN_ENTRY, END_ACCESSOR, END_ACCESSOR_MAP, DEFINE_COMMAND
Dieses Beispiel demonstriert die folgenden Funktionen:
CreateThread, GetCurrentThreadId, GetExitCodeThread, WaitForMultipleObjects
Hinweis
Einige Beispiele wie diesen, wurden nicht geändert, um Änderungen in der Visual C++-Assistenten, Bibliotheken und Compiler, demonstrieren aber dennoch wie Sie die gewünschte Aufgabe durchführen.