Freigeben über


Beispiel für MultiRead-Attribute: Liest eine Datenbanktabelle mithilfe von mehreren Threads

Aktualisiert: November 2007

Das MultiRead-Attributbeispiel demonstriert die Verwendung der OLE DB-Consumervorlagenklassen zum Lesen einer Tabelle in einer Datenbank mithilfe mehrerer Threads.

Das MultiRead-Beispiel ist die nicht attributierte Version dieses Beispiels.

Sicherheitshinweis:

Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird.

So rufen Sie Beispiele und Anweisungen für ihre Installation ab

  • Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.

    Weitere Informationen finden Sie unter Suchen von Beispieldateien.

  • Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.

  • Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.

Erstellen und Ausführen des Beispiels

  1. Öffnen Sie die Projektmappendatei MultiRead.sln.

  2. Klicken Sie im Menü Erstellen auf die Option Erstellen.

  3. Klicken Sie im Menü Debuggen auf Starten ohne Debuggen.

  4. Es wird ein Dialogfeld Multi-Thread lesen angezeigt, in dem Sie dazu aufgefordert werden, die Anzahl der zum Lesen der Tabelle zu verwendenden Threads anzugeben. Klicken Sie auf Ausführen.

    Das Ergebnis wird im Dialogfeld Multi-Thread lesen als Text angezeigt (beispielsweise 15 records in 7 ms).

So funktioniert das Beispiel

Das Beispiel enthält die CMultiDlg-Klasse, die zum Anzeigen eines Dialogfelds verwendet wird. In diesem Dialogfeld gibt der Benutzer die Anzahl der zum Lesen der Tabelle zu verwendenden Threads ein. Wenn der Benutzer auf die Schaltfläche Ausführen klickt, wird ReadRecords in DBRead.h aufgerufen, um die Datenbank, Sitzung und Tabelle zu öffnen sowie die erforderliche Threadanzahl zu erstellen. Beim Öffnen der Tabelle legt die Funktion die DBPROP_CANHOLDROWS-Eigenschaft auf True fest, sodass der Anbieter dem Benutzer das Abrufen neuer Zeilen ohne Freigabe der zuvor abgerufenen Zeilen ermöglicht. Dies ist erforderlich, weil mehrere Threads neue Zeilen abrufen, während andere Threads noch mit der Verarbeitung ihrer aktuellen Threads beschäftigt sind.

Das Beispiel zeigt darüber hinaus, wie die standardmäßige CRowset-Klasse erweitert wird, indem eine neue, von CRowset abgeleitete CMyRowset-Klasse erstellt wird, und fügt die MoveAndProcess-Memberfunktion hinzu. Die Startroutine jedes Threads ist die ReadTable-Funktion. An diese Funktion wird die Tabellenklasse übergeben. Die Funktion ruft die Routine MoveAndProcess auf, um jeden Datensatz zu lesen. Die Accessorklasse CProduct wird so definiert, dass die Daten beim MoveNext-Aufruf nicht automatisch abgerufen werden. Hierdurch werden Pufferkonflikte mit anderen Threads vermieden und MoveNext muss nicht mit einem kritischen Abschnitt geschützt werden. Die MoveAndProcess-Funktion ruft MoveNext und anschließend GetDataHere auf, um die Daten direkt in einer lokalen Variablen dieser Funktion zu platzieren. Für jeden abgerufenen Datensatz wird ProcessRecord aufgerufen, und die Funktion erfasst einfach standardmäßig die Werte des Datensatzes.

Jeder Thread zählt die Anzahl der von ihm gelesenen Datensätze, und diese werden abschließend zusammen mit einem Gesamtwert und der benötigten Zeit erfasst. Dies wird im Dialogfeld angezeigt.

Hinweis:

Im MultiRead-Beispiel wird die Datenbankdatei MultiRead.mdb gelesen. Im Beispielcode wird davon ausgegangen, dass sich 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

Das Beispiel demonstriert die Verwendung der 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:

In diesem und einigen anderen Beispielen wurden die Änderungen an den Visual C++-Assistenten, -Bibliotheken und -Compilern noch nicht nachvollzogen. Sie demonstrieren aber dennoch, wie Sie die gewünschte Aufgabe durchführen können.

Siehe auch

Weitere Ressourcen

ATL-Attributbeispiele