MultiRead-Attribute: Liest eine Datenbanktabelle mithilfe mehrerer Threads
Das MultiRead-Attributbeispiel demonstriert wie mit die OLE DB-Consumerklassen Vorlage Lesen einer Tabelle in einer Datenbank mithilfe mehrerer Threads.
Das MultiRead-Beispiel-von a42h7da1(v=vs.100).md ist die nicht 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
Ö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 auf die Schaltfläche ausführen , wird ReadRecords in DBRead.h aufgerufen, um die Datenbank, Sitzung und Tabelle zu öffnen und die erforderliche Threadanzahl 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 auf 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 für jeden abgerufenen Datensatz aufgerufen 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.
Attribute
In diesem Beispiel werden die folgenden Attribute verwendet:
db_column , db_source, db_table, exe, helpstring, module, name, threading, uuid, version
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.