MTRECALC 示例:支持多线程应用程序

更新:2007 年 11 月

MTRECALC 示例阐释 MFC 对多线程应用程序的支持。

MFC 区分两种类型的线程:用户界面线程和辅助线程。用户界面线程有自己独立于其他线程的消息泵来处理用户界面事件。辅助线程没有自己的消息泵。MTRECALC 阐释一个辅助线程。该辅助线程模拟一个冗长计算,在完成两个数字的加法计算之前等待计时器。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

生成并运行 MTRECALC 示例

  1. 打开解决方案 MtRecalc.sln。

  2. 在“生成”菜单中单击“生成”。

  3. 在“调试”菜单中,单击“开始执行(不调试)”。

MTRECALC 显示一个将两个整数相加的简单窗体,并模拟一个电子表格。每当更新单元格或单击“Recalculate Now”时,此电子表格都重新计算。在 MTRECALC 模拟冗长计算期间,结果字段显示“Recalculating...”。通过在“Demo”菜单上单击“Speed of Recalculation”,可以更改重新计算的时间。

在“Demo”菜单上单击“Worker Thread”或“Single Thread”,对比在单独的辅助线程中重新计算与在主应用程序用户界面线程所在的同一线程中重新计算的“感受”。例如,在单线程演示中,当 MTRECALC 正在重新计算时无法访问它的菜单,而在辅助线程演示时则可以。在单线程演示中,当 MTRECALC 正在重新计算时无法更新任何一个整数字段,而在辅助线程演示中则可以。如果您在辅助线程已经开始重新计算时更新一个字段,当前的重新计算将被放弃并开始一个新的计算。

“Demo”菜单上的“Kill Worker Thread”命令仅在辅助线程正在进行重新计算时才启用。如果使用“Kill Worker Thread”命令在重新计算完成之前将其中断,则结果字段将显示一个问号(“?”)。可以使用“Recalculate Now”命令重新开始计算。

如果试图在重新计算完成之前保存 MTRECALC 文档,则会提示您“Do you wish to wait while recalculation finishes?”。如果回答“是”,则 MTRECALC 将显示一个沙漏,并在保存文档之前等待重新计算完成。为了练习此演示,可能需要使用“Speed of Recalculation”命令将重新计算时间从默认的 5 秒增加到 10 秒或 15 秒。这将使您有足够的时间来定位到“文件”菜单和“保存”对话框。

关键字

此示例说明以下关键字:

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

说明:

某些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。

请参见

其他资源

MFC 示例