MTRECALC, exemple : prend en charge des applications multithread
Mise à jour : novembre 2007
L'exemple MTRECALC illustre la prise en charge d'applications multithread par les MFC.
MFC distingue deux types de threads : les threads d'interface utilisateur et les threads de travail. Un thread d'interface utilisateur possède sa propre pompe de messages pour gérer les événements de l'interface utilisateur en dehors des autres threads. Un thread de travail ne possède pas sa propre pompe de messages. MTRECALC illustre un thread de travail. Le thread de travail simule un calcul long en attendant le signal d'une minuterie pour effectuer l'addition de deux nombres.
Note de sécurité : |
---|
Cet exemple de code est fourni pour illustrer un concept et ne doit pas être utilisé dans des applications ou des sites Web, car il peut ne pas illustrer les pratiques de programmation les plus sûres. Microsoft n'assume aucune responsabilité pour tout dommage indirect ou consécutif en cas d'utilisation de l'exemple de code à des fins autres que celles prévues. |
Pour obtenir des exemples et des instructions d'installation :
Dans le menu ? (Aide) de Visual Studio, cliquez sur Exemples.
Pour plus d'informations, consultez Recherche des fichiers d'exemple.
La liste la plus récente et la plus complète d'exemples est disponible en ligne à partir de la page Visual Studio 2008 Samples.
Des exemples sont également disponibles sur le disque dur de votre ordinateur. Des exemples et un fichier Readme sont stockés par défaut dans un dossier sous \Program Files\Visual Studio 9.0\Samples\. Pour les éditions Express de Visual Studio, tous les exemples sont disponibles en ligne.
Génération et exécution de l'exemple
Pour générer et exécuter l'exemple MTRECALC
Ouvrez la solution MtRecalc.sln.
Dans le menu Générer, cliquez sur Générer.
Dans le menu Déboguer, cliquez sur Exécuter sans débogage.
MTRECALC affiche un formulaire simple permettant d'additionner deux entiers et simule un tableur qui recalcule l'opération dès que vous mettez à jour une cellule ou cliquez sur Recalculate Now. Le champ de résultat affiche "Recalculating..." pendant que MTRECALC simule un calcul long. Vous pouvez modifier la durée de recalcul en cliquant dans le menu Demo sur Speed of Recalculation.
Cliquez dans le menu Demo sur Worker Thread ou Single Thread pour comparer l'opération de recalcul selon qu'elle s'effectue dans un thread de travail distinct ou dans le thread principal de l'interface utilisateur de l'application. Par exemple, l'accès aux menus de MTRECALC pendant que l'application effectue un recalcul est impossible dans l'exemple à un seul thread, mais possible dans l'exemple à thread de travail. Par exemple, l'accès aux menus de MTRECALC pendant que l'application effectue un recalcul est impossible dans l'exemple à un seul thread, mais possible dans l'exemple à thread de travail. Si vous mettez à jour un champ alors que le thread de travail effectue un recalcul, le recalcul en cours est abandonné et un autre commence.
La commande Kill Worker Thread du menu Demo est disponible uniquement lorsque le thread de travail effectue un recalcul. Si vous utilisez la commande Kill Worker Thread pour interrompre un recalcul avant son terme, le champ de résultat affiche un point d'interrogation ("?"). Vous pouvez redémarrer le recalcul à l'aide de la commande Recalculate Now.
Si vous essayez d'enregistrer le document MTRECALC avant la fin du recalcul, un message vous propose d'attendre la fin de l'opération en cours. Si vous acceptez, MTRECALC affiche un sablier jusqu'à la fin du recalcul, puis enregistre le document. Pour tester ce comportement, vous devrez probablement augmenter la durée de recalcul de 5 secondes (durée par défaut) à 10 ou 15 secondes à l'aide de la commande Speed of Recalculation. Cela vous laissera le temps de naviguer dans le menu File et la boîte de dialogue Save.
Mots clés
Cet exemple illustre l'utilisation des mots clés suivants :
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
Remarque : |
---|
Certains exemples, tels que celui-ci, n'ont pas été modifiés pour refléter les changements apportés aux Assistants, aux bibliothèques et au compilateur Visual C++, mais ils illustrent bien l'exécution de la tâche souhaitée. |