MultiRead 属性サンプル : 複数のスレッドを使用してデータベース テーブルを読み取る
更新 : 2007 年 11 月
MultiRead 属性サンプルでは、OLE DB コンシューマ テンプレート クラスを使用して複数のスレッドでデータベース テーブルを読み取る方法を示します。
MultiRead サンプルは、このサンプルの属性なしバージョンです。
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
ソリューション ファイル MultiRead.sln を開きます。
[ビルド] メニューの [ビルド] をクリックします。
[デバッグ] メニューの [デバッグなしで開始] をクリックします。
[Multi-Threaded Read] ダイアログ ボックスが表示され、テーブルの読み取りに使用するスレッド数を指定するように要求されます。[Run] をクリックします。
結果は [Multi-Threaded Read] ダイアログ ボックスにテキストで表示されます。たとえば、15 records in 7 ms のように表示されます。
サンプルの動作
このサンプルには、ダイアログ ボックスの表示に使用される CMultiDlg クラスが含まれています。このダイアログ ボックスを使用して、テーブルの読み取りに使用するスレッド数をユーザーが入力します。ユーザーが [Run] をクリックすると、DBRead.h の ReadRecords が呼び出され、データベース、セッション、およびテーブルが開き、必要な数のスレッドが作成されます。テーブルが開かれると、関数によって DBPROP_CANHOLDROWS プロパティが true に設定されるため、プロバイダではユーザーが直前に取得した行を解放せずに新しい行を取得できます。この機能は、ほかのスレッドが現在のスレッドを処理しているときに、複数のスレッドによって新しい行が取得されるために必要です。
このサンプルでは、CRowset から派生する新しい CMyRowset クラスを作成して標準の CRowset クラスを拡張する方法も示します。さらに、MoveAndProcess メンバ関数が追加されます。各スレッドの開始ルーチンは ReadTable 関数であり、この関数にテーブル クラスが渡されます。この関数は MoveAndProcess ルーチンを呼び出して各レコードを読み取ります。MoveNext 呼び出しでデータが自動的に取得されないように、アクセサ クラス CProduct が定義されています。したがって、ほかのスレッドとのバッファの競合が回避され、クリティカル セクションを使用して MoveNext を保護する必要はなくなります。MoveAndProcess 関数は MoveNext を呼び出してから GetDataHere を呼び出して、データを関数のローカル変数に直接挿入します。既定では、取得したレコードごとに ProcessRecord が呼び出され、関数はレコードの値をトレースするだけです。
各スレッドは、読み取ったレコード数をカウントします。レコードは最後にトレースされ、合計数および所要時間と共にダイアログ ボックスに表示されます。
メモ : |
---|
MultiRead サンプルでは、MultiRead.mdb データベース ファイルを読み込みます。サンプル コードでは、このファイルが現在のディレクトリにあると仮定しています。 |
属性
このサンプルでは次の属性を使用します。
db_column、db_source、db_table、exe、helpstring、module、name、threading、uuid、version
キーワード
このサンプルでは次のクラスを使用します。
CAccessor、CDataSource、CDBPropSet、CRowset、CSession、CTable
このサンプルでは次のマクロを使用します。
BEGIN_ACCESSOR_MAP、BEGIN_ACCESSOR、COLUMN_ENTRY、END_ACCESSOR、END_ACCESSOR_MAP、DEFINE_COMMAND
このサンプルでは次の機能を使用します。
CreateThread、GetCurrentThreadId、GetExitCodeThread、WaitForMultipleObjects
メモ : |
---|
このサンプルを含む一部のサンプルには、Visual C++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。 |