Поделиться через


Образец MultiRead: считывание таблицы базы данных с использованием нескольких потоков

Обновлен: Ноябрь 2007

Образец MultiRead демонстрирует использование классов-шаблонов потребителей OLE DB для считывания данных из таблицы базы данных в несколько потоков.

Образец атрибутов MultiRead представляет версию этого образца с поддержкой атрибутов.

a42h7da1.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению.

Чтобы получить образцы и инструкции по их установке, выполните следующие действия.

  • В меню Справка среды Visual Studio выберите пункт Примеры.

    Дополнительные сведения см. в разделе Поиск файлов примеров.

  • Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.

  • Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.

Построение и запуск образца

Построение и запуск этого образца

  1. Откройте файл решения MultiRead.sln.

  2. В меню Построение выберите команду Построить.

  3. В меню Отладка выберите команду Запуск без отладки.

  4. Откроется диалоговое окно Multi-Threaded Read, в котором нужно указать количество потоков, используемых для считывания данных из таблицы. Нажмите кнопку Run.

  5. Результаты появятся в диалоговом окне Multi-Threaded Read в текстовом виде, например: 15 records in 7 ms.

Принцип работы образца

Образец содержит класс CMultiDlg, который используется для отображения диалогового окна. В этом диалоговом окне пользователь вводит количество потоков, используемых для считывания данных из таблицы. Когда пользователь нажимает кнопку Run, вызывается метод ReadRecords из файла DBRead.h, чтобы открыть базу данных, сеанс и таблицу, а также создать необходимое количество потоков. Во время открытия таблицы эта функция устанавливает свойство DBPROP_CANHOLDROWS в значение true, чтобы поставщик давал пользователю возможность извлекать новые строки без освобождения ранее извлеченных строк. Такая возможность необходима, поскольку несколько потоков извлекают новые строки в то время как другие потоки продолжают текущие задачи обработки.

В образце также показано, как расширить стандартный класс CRowset, создав новый класс CMyRowset, производный от CRowset, и добавить функцию-член MoveAndProcess. Стартовой подпрограммой каждого потока является функция ReadTable, которой передается класс таблицы. Функция вызывает подпрограмму MoveAndProcess для считывания каждой записи. Обратите внимание, что класс доступа CProduct определяется таким образом, чтобы данные во время вызова MoveNext не извлекались автоматически. Это позволяет избежать конфликта с другими потоками и устраняет необходимость защищать MoveNext критической секцией. Функция MoveAndProcess вызывает функцию MoveNext, а затем вызывает функцию GetDataHere, чтобы поместить данные непосредственно в локальную переменную этой функции. Функция ProcessRecord вызывается для каждой извлекаемой записи и по умолчанию просто отслеживает значения записи.

Каждый поток подсчитывает количество считываемых записей, и это количество выводится в диалоговом окне в конце работы вместе с общим количеством и затраченным временем.

a42h7da1.alert_note(ru-ru,VS.90).gifПримечание.

Образец 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

a42h7da1.alert_note(ru-ru,VS.90).gifПримечание.

Некоторые образцы, включая данный, не модифицировались с учетом изменений в мастерах, библиотеках и компиляторе Visual C++, однако по-прежнему демонстрируют выполнение требуемой задачи.

См. также

Другие ресурсы

Образцы ATL