MultiRead 샘플: 다중 스레드를 사용하여 데이터베이스 테이블 읽기
업데이트: 2007년 11월
MultiRead 샘플에서는 OLE DB 소비자 템플릿 클래스를 사용하여, 다중 스레드로 데이터베이스의 테이블을 읽는 방법을 보여 줍니다.
MultiRead 특성 샘플은 이 샘플의 특성 사용 버전입니다.
보안 정보: |
---|
이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다. |
샘플 및 이를 설치하기 위한 지침을 가져오려면
Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.
자세한 내용은 샘플 파일 찾기를 참조하십시오.
최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.
컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \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에서 파생되고 MoveAndProcess 멤버 함수가 추가된 새 CMyRowset 클래스를 만들어 표준 CRowset 클래스를 확장하는 방법도 보여 줍니다. 각 스레드의 시작 루틴은 ReadTable 함수이며 테이블 클래스는 이 함수에 전달됩니다. 이 함수는 MoveAndProcess 루틴을 호출하여 각 레코드를 읽습니다. 접근자 클래스 CProduct는 MoveNext가 호출될 때 데이터가 자동으로 검색되지 않도록 정의되어 있습니다. 이렇게 하면 다른 스레드와의 버퍼 충돌이 일어나지 않으며 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++ 마법사, 라이브러리 및 컴파일러의 변경 내용을 반영하도록 수정되지 않았지만 해당 작업의 수행 방법을 보여 줍니다. |