MultiRead 屬性範例:使用多個執行緒讀取資料庫資料表

更新:2007 年 11 月

MultiRead 屬性 (Attribute) 範例會示範如何以多個執行緒來使用 OLE DB 消費者樣板類別,讀完資料庫中的某一個資料表。

MultiRead 範例是本範例的未使用屬性版本。

安全性注意事項:

這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。

若要取得範例和指示以便進行安裝:

  • 按一下 Visual Studio [說明] 功能表上的 [範例]。

    如需詳細資訊,請參閱尋找範例檔案

  • 最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。

  • 您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。

建置和執行範例

  1. 開啟方案檔 MultiRead.sln。

  2. 從 [建置] 功能表中,按一下 [建置]。

  3. 從 [偵錯] 功能表中,按一下 [啟動但不偵錯]。

  4. [多執行緒讀取] 對話方塊會出現,提示您指定用來讀完資料表的執行緒個數。按一下 [執行]。

    結果會顯示為 [多執行緒讀取] 對話方塊中的文字,例如,15 records in 7 ms。

範例如何操作

本範例包括用於顯示對話方塊的 CMultiDlg 類別。使用者可以利用這個對話方塊,輸入要使用來讀完資料表的執行緒個數。當使用者按一下 [執行] 按鈕,就會呼叫 DBRead.h 中的 ReadRecords 以開啟資料庫、工作階段 (Session) 和資料表,以及建立需要的執行緒數量。當資料表開啟時,函式設定 DBPROP_CANHOLDROWS 屬性為 true,讓提供者允許使用者擷取新的資料列,而不需釋放之前擷取的資料列。這是一個必要的功能,因為當其他執行緒仍在進行他們目前的執行緒時,會有多個執行緒擷取新的資料列。

本範例也顯示如何藉由建立新的 CMyRowset 類別來擴充標準 CRowset 類別,這個新類別衍生自 CRowset,且加入了 MoveAndProcess 成員函式。每個執行緒的起始常式都是 ReadTable 函式,且資料表類別會傳遞至該函式。函式會呼叫 MoveAndProcess 常式以讀完每個資料錄。請注意,已經定義存取子類別 CProduct,所以不會在 MoveNext 呼叫時自動擷取資料。此動作避免緩衝區與其他執行緒相衝突,且不需使用關鍵區段 (Critical Section) 保護 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++ 精靈、程式庫以及編譯器方面的變更,不過還是可以示範如何完成您要進行的工作。

請參閱

其他資源

ATL 屬性範例