Поделиться через


Образец MTRECALC: поддержка многопоточных приложений

Обновлен: Ноябрь 2007

В образце MTRECALC показана доступная в MFC поддержка многопоточных приложений.

В MFC различаются два типа потоков: потоки пользовательского интерфейса и рабочие потоки. Поток пользовательского интерфейса имеет собственный цикл обработки сообщений, чтобы обрабатывать события пользовательского интерфейса отдельно от других потоков. Рабочий поток не обладает собственным циклом обработки сообщений. В образце MTRECALC показан рабочий поток. Рабочий поток имитирует продолжительное вычисление, ожидая истечения таймера перед завершением вычисления, состоящего в сложении двух чисел.

3kk6acaf.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению.

Чтобы получить образцы и инструкции по их установке, выполните следующие действия.

  • В меню Справка среды Visual Studio выберите пункт Примеры.

    Дополнительные сведения см. в разделе Поиск файлов примеров.

  • Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.

  • Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.

Построение и запуск образца

Построение и запуск образца MTRECALC

  1. Откройте решение MtRecalc.sln.

  2. В меню Построение выберите команду Построить.

  3. В меню Отладка выберите пункт Запуск без отладки.

В образце MTRECALC выводится простая форма для сложения двух целых чисел, имитируя электронную таблицу, которая повторяет вычисления при каждом обновлении ячейки, а также в случае нажатия кнопки Recalculate Now. В результирующем поле выводится строка "Recalculating...", пока приложение MTRECALC имитирует продолжительное вычисление. Можно изменить интервал повторного вычисления, выбрав пункт Speed of Recalculation в меню Demo.

Выберите в меню Demo пункт Worker Thread или Single Thread, чтобы сравнить наблюдаемый эффект вычисления в отдельном рабочем потоке с вычислением в одном потоке с главным потоком пользовательского интерфейса приложения. Например, в варианте Single Thread меню MTRECALC недоступны во время вычислений, но доступны в варианте Worker Thread. В варианте Single Thread невозможно обновить одно из целочисленных полей во время вычисления MTRECALC, но это можно сделать в варианте Worker Thread. Если обновить поле, пока рабочий поток занят вычислением, активное вычисление будет прекращено и будет запущено новое вычисление.

Команда Kill Worker Thread в меню Demo доступна только пока рабочий поток занят вычислением. Если использовать команду Kill Worker Thread, чтобы прервать вычисление до его завершения, то в результирующем поле будет отображаться вопросительный знак ("?"). Можно перезапустить вычисление с помощью команды Recalculate Now.

Если выполнить попытку сохранить документ MTRECALC перед завершением вычисления, появится предупреждение с текстом "Do you wish to wait while recalculation finishes?" Если в ответ нажать кнопку "Yes", в приложении MTRECALC будет выводиться курсор в виде песочных часов, пока приложение ожидает завершения вычисления перед сохранением документа. Чтобы использовать этот демонстрационный сценарий, вероятно, понадобится использовать команду Speed of Recalculation, чтобы увеличить интервал повторного вычисления с 5 секунд (по умолчанию) до 10 или 15 секунд. Это позволит получить достаточно времени, чтобы выполнить операции в меню File и диалоговом окне Save.

Ключевые слова

В этом образце показаны следующие ключевые слова:

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

3kk6acaf.alert_note(ru-ru,VS.90).gifПримечание.

Некоторые образцы, включая данный, не модифицировались с учетом изменений в мастерах, библиотеках и компиляторе Visual C++, однако по-прежнему демонстрируют выполнение требуемой задачи.

См. также

Другие ресурсы

Примеры MFC