Condividi tramite


Esempio MultiRead: lettura di una tabella di database utilizzando più thread

Aggiornamento: novembre 2007

Nell'esempio MultiRead viene illustrato come utilizzare le classi di modelli consumer OLE DB per leggere una tabella di database utilizzando più thread.

In Esempio di attributi MultiRead viene fornita la versione con gli attributi di questo esempio.

Nota sulla sicurezza:

Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti.

Per ottenere gli esempi e le istruzioni per l'installazione:

  • In Visual Studio scegliere Esempi dal menu ?.

    Per ulteriori informazioni, vedere Individuazione dei file di esempio.

  • La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.

  • È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.

Generazione ed esecuzione dell'esempio

Per generare ed eseguire l'esempio

  1. Aprire il file di soluzione MultiRead.sln.

  2. Scegliere Genera dal menu Genera.

  3. Scegliere Avvia senza eseguire debug dal menu Debug.

  4. Verrà visualizzata una finestra di dialogo per la lettura mediante più thread nella quale verrà richiesto di specificare il numero di thread da utilizzare per la lettura della tabella. Scegliere Esegui.

  5. Il risultato verrà visualizzato come testo, ad esempio 15 records in 7 ms, nella finestra di dialogo Multi-Threaded Read.

Funzionamento dell'esempio

L'esempio contiene la classe CMultiDlg, utilizzata per visualizzare una finestra di dialogo. In questa finestra di dialogo è possibile specificare il numero di thread da utilizzare per la lettura della tabella. Quando viene scelto il pulsante Esegui, viene chiamato ReadRecords in DBRead.h per aprire il database, la sessione e la tabella e creare il numero richiesto di thread. Al momento dell'apertura della tabella, la funzione imposta la proprietà DBPROP_CANHOLDROWS su true affinché il provider consenta all'utente di recuperare nuove righe senza rilasciare le righe precedentemente recuperate. Questa funzionalità è necessaria poiché più thread recuperano nuove righe mentre altri thread continuano a elaborare i thread correnti.

Nell'esempio viene inoltre illustrato come estendere la classe CRowset standard creando una nuova classe CMyRowset che deriva da CRowset e aggiunge la funzione membro MoveAndProcess. La routine di avvio di ciascun thread corrisponde alla funzione ReadTable, a cui viene passata la classe della tabella. Tale funzione chiama la funzione MoveAndProcess della routine per effettuare la lettura di ciascun record. Si noti che la classe di funzioni di accesso CProduct viene definita in modo che i dati non vengano recuperati automaticamente alla successiva chiamata a MoveNext. Questa impostazione consente di evitare conflitti a livello di buffer con gli altri thread ed elimina l'esigenza di proteggere MoveNext con una sezione critica. La funzione MoveAndProcess chiama MoveNext e quindi GetDataHere per inserire i dati direttamente in una variabile locale di tale funzione. Per ciascun record recuperato viene effettuata la chiamata a ProcessRecord. Per impostazione predefinita, la funzione analizza semplicemente i valori del record.

Ciascun thread conteggia il numero di record letti, che vengono analizzati al termine dell'operazione, nonché il totale e il tempo impiegato, visualizzato nella finestra di dialogo.

Nota:

Nell'esempio MultiRead viene letto il file di database MultiRead.mdb, presupponendo che tale file si trovi nella directory corrente.

Parole chiave

Nell'esempio vengono illustrate le seguenti classi:

CAccessor, CDataSource, CDBPropSet, CRowset, CSession, CTable

Nell'esempio vengono illustrate le seguenti macro:

BEGIN_ACCESSOR_MAP, BEGIN_ACCESSOR, COLUMN_ENTRY, END_ACCESSOR, END_ACCESSOR_MAP, DEFINE_COMMAND

Nell'esempio vengono illustrate le seguenti funzioni:

CreateThread, GetCurrentThreadId, GetExitCodeThread, WaitForMultipleObjects

Nota:

Alcuni esempi, tra cui il presente, non sono stati cambiati per riflettere le modifiche apportate alle procedure guidate, alle librerie e al compilatore di Visual C++, tuttavia forniscono comunque le istruzioni per completare l'attività desiderata.

Vedere anche

Altre risorse

Esempi relativi ad ATL