MTRECALC-Beispiel: Unterstützt Multithreadanwendungen

Aktualisiert: November 2007

Das MTRECALS-Beispiel erläutert die MFC-Unterstützung für Multithreadanwendungen.

In MFC werden zwei Threadtypen unterschieden: Benutzeroberflächenthreads und Arbeitsthreads. Benutzeroberflächenthreads verfügen über ein eigenes Nachrichtensystem, mit dem Benutzeroberflächenereignisse separat von anderen Threads behandelt werden. Ein Arbeitsthread verfügt über kein eigenes Nachrichtensystem. MTRECALC veranschaulicht einen Arbeitsthread. Der Arbeitsthread simuliert eine längere Berechnung, indem er auf einen Zeitgeber wartet, bevor er die Addition zweier Zahlen beendet.

Sicherheitshinweis:

Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird.

So rufen Sie Beispiele und Anweisungen für ihre Installation ab

  • Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.

    Weitere Informationen finden Sie unter Suchen von Beispieldateien.

  • Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.

  • Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.

Erstellen und Ausführen des Beispiels

So erstellen Sie das MTRECALC-Beispiel und führen es aus

  1. Öffnen Sie die Projektmappe MtRecalc.sln.

  2. Klicken Sie im Menü Erstellen auf Erstellen.

  3. Klicken Sie im Menü Debuggen auf Starten ohne Debuggen.

MTRECALC zeigt ein einfaches Formular an, mit dem Sie zwei ganze Zahlen addieren können. Es wird eine Tabellenkalkulation simuliert, die nach jeder Zellenaktualisierung oder nach Klicken auf Recalculate Now eine Neuberechnung durchführt. Für die Zeit, in der MTRECALC eine längere Berechnung simuliert, wird im Ergebnisfeld "Recalculating..." angezeigt. Die Neuberechnungszeit können Sie durch Klicken auf Speed of Recalculation im Menü Demo ändern.

Klicken Sie im Menü Demo auf Worker Thread oder Single Thread, um den Vorgang der Neuberechnung in einem separaten Arbeitsthread und die Neuberechnung im selben Thread wie dem der Benutzeroberfläche der Hauptanwendung miteinander zu vergleichen. Im Einzelthreadbeispiel können Sie während der Neuberechnung nicht auf die MTRECALC-Menüs zugreifen, im Arbeitsthreadbeispiel ist dies jedoch möglich. Im Einzelthreadbeispiel können Sie während der Neuberechnung durch MTRECALC keines der Ganzzahlenfelder aktualisieren, hingegen ist dies im Arbeitsthreadbeispiel möglich. Wenn Sie während der Neuberechnung eines Arbeitsthreads ein Feld aktualisieren, wird die aktive Neuberechnung abgebrochen und eine neue gestartet.

Der Befehl Kill Worker Thread im Menü Demo ist nur aktiviert, während der Thread eine Neuberechnung durchführt. Wenn Sie den Befehl Kill Worker Thread zur Unterbrechung einer laufenden Neuberechnung verwenden, wird im Ergebnisfeld ein Fragezeichen ("?") angezeigt. Sie können die Berechnung mit dem Befehl Recalculate Now erneut beginnen.

Wenn Sie das MTRECALC-Dokument vor Abschluss der Neuberechnung schließen, wird die Meldung "Do you wish to wait while recalculation finishes?" angezeigt. Wenn Sie mit Ja antworten, wartet MTRECALS vor dem Speichern auf den Abschluss der Neuberechnung und zeigt während dieser Zeit eine Sanduhr an. Für die Ausführung dieser Demonstration müssen Sie möglicherweise den Befehl Speed of Recalculation verwenden, um die Neuberechnungszeit vom Standardwert 5 Sekunden auf 10 oder 15 Sekunden zu erhöhen. Dadurch haben Sie ausreichend Zeit, durch das Menü Datei und das Dialogfeld Speichern zu navigieren.

Schlüsselwörter

Dieses Beispiel demonstriert die Verwendung der folgenden Schlüsselwörter:

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

Hinweis:

In diesem und einigen anderen Beispielen wurden die Änderungen an den Visual C++-Assistenten, -Bibliotheken und -Compilern noch nicht nachvollzogen. Sie demonstrieren aber dennoch, wie Sie die gewünschte Aufgabe durchführen können.

Siehe auch

Weitere Ressourcen

MFC-Beispiele