MultiRead 範例:使用多個執行緒來讀取資料庫資料表
更新:2007 年 11 月
MultiRead 範例示範如何透過多個執行緒使用 OLE DB 消費者樣板 (Consumer Template) 類別來讀取資料庫內的資料表。
ATLTangram 屬性範例是本範例的使用屬性版本。
安全性注意事項: |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。
建置和執行範例
若要建置和執行這個範例
開啟方案檔 MultiRead.sln。
從 [建置] 功能表中,按一下 [建置]。
從 [偵錯]功能表中,按一下 [啟動但不偵錯]。
[多執行緒讀取] 對話方塊會出現,提示您指定用來讀完資料表的執行緒個數。按一下 [執行]。
結果會在 [多執行緒讀取] 對話方塊顯示為文字,例如 15 records in 7 ms。
範例如何操作
本範例包括用來顯示對話方塊的 CMultiDlg 類別。利用這個對話方塊,使用者就可以輸入要使用來讀完資料表的執行緒個數。當使用者按一下 [Run] 按鈕時,就會呼叫 DBRead.h 內的 ReadRecords 來開啟資料庫、工作階段和資料表,並建立需要的執行緒數目。當資料表開啟時,函式設定 DBPROP_CANHOLDROWS 屬性 (Property) 為 true 因此提供者允許使用者擷取新的資料列,而不需釋放之前擷取的資料列。此功能是必須的,因為當其他執行緒仍在進行他們目前的執行緒時,有多個執行緒會擷取新的資料列。
本範例也顯示如何藉由建立新的 CMyRowset 類別來擴充標準 CRowset 類別,這個新類別衍生自 CRowset,且加入了 MoveAndProcess 成員函式。每個執行緒的起始常式都是 ReadTable 函式,且資料表類別會傳遞至此函式。函式會呼叫 MoveAndProcess 常式以讀完每個資料錄。請注意,已經定義存取子類別 CProduct,因此不會在 MoveNext 呼叫時自動擷取資料。這個動作可避免緩衝區與其他執行緒相衝突,且不需使用關鍵區段 (Critical Section) 保護 MoveNext。MoveAndProcess 函式會呼叫 MoveNext,然後呼叫 GetDataHere 將資料直接放入該函式的區域變數內。根據預設,會為所擷取的每個資料錄呼叫 ProcessRecord,而且函式只會追蹤資料錄值。
每一個執行緒都會計算它讀取的記錄筆數,以及追蹤到結尾的記錄,這些記錄的總數會連同花費的時間一起顯示在對話方塊上。
注意事項: |
---|
MultiRead 範例會讀取 MultiRead.mdb 資料庫檔案。此範例程式碼會假設該檔案是位於目前的目錄中。 |
關鍵字
本範例示範下列類別:
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++ 精靈、程式庫以及編譯器方面的變更,不過還是可以示範如何完成您要進行的工作。 |