Condividi tramite


Esempio MTRECALC: supporto di applicazioni con multithreading

Aggiornamento: novembre 2007

Nell'esempio MTRECALC viene illustrato il supporto MFC per le applicazioni con multithreading.

In MFC vengono distinti due tipi di thread: i thread di interfaccia utente e i thread di lavoro. Nei thread di interfaccia utente è presente un message pump per la gestione degli eventi dell'interfaccia utente in modo separato rispetto agli altri thread. I thread di lavoro, invece, non dispongono di alcun message pump. In MTRECALC viene illustrato un thread di lavoro che simula un calcolo di lunga durata attendendo un timer prima di completare l'operazione di somma di due numeri.

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 MTRECALC

  1. Aprire il file di soluzione MtRecalc.sln.

  2. Scegliere Genera dal menu Genera.

  3. Scegliere Avvia senza eseguire debug dal menu Debug.

In MTRECALC viene visualizzato un form semplice per la somma di due numeri interi, simulando un foglio di calcolo che esegue nuovamente il calcolo quando si aggiorna una cella o si sceglie il comando Recalculate Now. Nel campo dei risultati viene visualizzato il messaggio "Recalculating..." durante la simulazione del calcolo in MTRECALC. È possibile modificare il tempo di ricalcolo scegliendo Speed of Recalculation dal menu Demo.

Scegliere Worker Thread o Single Thread dal menu Demo, per verificare la differenza tra il ricalcolo in un thread di lavoro separato e il ricalcolo nello stesso thread principale di interfaccia utente dell'applicazione. Nella dimostrazione del thread singolo, ad esempio, durante l'operazione di ricalcolo non è possibile accedere ai menu di MTRECALC, mentre durante la dimostrazione del thread di lavoro è possibile. Nella dimostrazione del thread singolo, non è possibile aggiornare nessuno dei campi dei numeri interi durante l'operazione di ricalcolo, mentre nella dimostrazione del thread di lavoro è possibile. Se si aggiorna un campo mentre il thread di lavoro sta già eseguendo il ricalcolo, l'operazione in corso verrà interrotta e ne verrà avviata una nuova.

Il comando Kill Worker Thread del menu Demo è attivato solo quando il thread di lavoro esegue il ricalcolo. Se si utilizza il comando Kill Worker Thread per interrompere il ricalcolo prima che sia completato, nel campo dei risultati verrà visualizzato un punto interrogativo ("?"). È possibile riavviare il calcolo con il comando Recalculate Now.

Se si tenta di salvare il documento MTRECALC prima che il ricalcolo sia stato completato, verrà visualizzato un messaggio in cui viene richiesto se si desidera attendere la fine dell'operazione. Se si sceglie di attendere, viene visualizzata una clessidra durante il completamento del ricalcolo prima di salvare il documento. Per esercitarsi con la dimostrazione, è possibile utilizzare il comando Speed of Recalculation, per aumentare la durata del ricalcolo dall'impostazione predefinita di 5 secondi a 10 o 15 secondi. In questo modo, sarà disponibile più tempo per passare al menu File e alla finestra di dialogo Save.

Parole chiave

Nell'esempio vengono illustrate le seguenti parole chiave:

AfxBeginThread; AfxGetMainWnd; AfxMessageBox; CArchive::IsStoring; CCmdTarget::BeginWaitCursor; CCmdTarget::EndWaitCursor; CCmdUI::Enable; CCmdUI::SetCheck; CDialog::DoModal; CDocument::GetFirstViewPosition; CDocument::GetNextView; CDocument::OnNewDocument; CDocument::OnSaveDocument; CDocument::SetModifiedFlag; CDocument::UpdateAllViews; CFrameWnd::Create; CFrameWnd::DockControlBar; CFrameWnd::EnableDocking; CFrameWnd::LoadFrame; CObject::AssertValid; CObject::Dump; CObject::Serialize; CStatusBar::CommandToIndex; CStatusBar::SetPaneText; CString::Format; CString::LoadString; CView::DoPreparePrinting; CView::GetDocument; CView::OnBeginPrinting; CView::OnEndPrinting; CView::OnPreparePrinting; CView::OnPrint; CView::OnUpdate; CWinApp::AddDocTemplate; CWinApp::EnableShellOpen; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::RegisterShellFileTypes; CWnd::DoDataExchange; CWnd::OnCreate; CWnd::OnKillFocus; CWnd::PostMessage; CWnd::SendMessage; CWnd::SetWindowText; CWnd::ShowWindow; CWnd::UpdateData; CWnd::UpdateWindow; CreateEvent; DragAcceptFiles; GetExitCodeThread; GetVersion; LoadBitmap; PostMessage; ResetEvent; SetEvent; Sleep; WaitForSingleObject

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 MFC