MultiRead 属性示例:使用多线程读取数据库表

更新:2007 年 11 月

MultiRead 属性示例说明如何使用 OLE DB 使用者模板类以多线程方式读取数据库中的表。

MultiRead 示例为此示例的非属性化版本。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

  1. 打开解决方案文件 MultiRead.sln。

  2. 从“生成”菜单中单击“生成”。

  3. 在“调试”菜单中,单击“开始执行(不调试)”。

  4. 将出现“多线程读取”对话框,提示您指定用于读取表的线程数。单击“运行”。

    结果将以文本形式出现在“多线程读取”对话框中,例如 15 records in 7 ms。

示例的工作机制

该示例包含用于显示对话框的 CMultiDlg 类。通过此对话框,用户输入用于读取表的线程数。当用户单击“Run”按钮时,将调用 DBRead.h 中的 ReadRecords 来打开数据库、会话和表,并创建必要数目的线程。当该函数打开表时,它将 DBPROP_CANHOLDROWS 属性设置为真,以便提供程序允许用户不必释放以前检索的行即可检索新行。该功能是必需的,因为多个线程会在其他的线程仍旧在处理其当前线程时检索新行。

该示例还显示了如何通过创建一个从 CRowset 派生的新 CMyRowset 类来扩展标准的 CRowset 类,并添加 MoveAndProcess 成员函数。每个线程的启动例程均为 ReadTable 函数,表类将传送给该函数。该函数调用例程 MoveAndProcess 以读取每个记录。注意,定义了访问器类 CProduct,以便当 MoveNext 调用时不会自动检索数据。这样就避免了与其他线程的缓冲区冲突,并且不再需要用临界区来保护 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 属性示例