MTRECALC 範例:支援多執行緒應用程式
更新:2007 年 11 月
MTRECALC 範例會介紹多執行緒應用程式的 MFC 支援。
MFC 能夠分辨兩種類型的執行緒:使用者介面執行緒和背景工作執行緒 (Worker Thread)。使用者介面執行緒有自己的訊息幫浦,用來與其他執行緒區別,處理使用者介面事件。背景工作執行緒沒有專屬的訊息幫浦。MTRECALC 說明出背景工作執行緒。背景工作執行緒等待定時器在完成兩個數字相加的計算之前,模擬比較長的計算。
安全性注意事項: |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。
建置和執行範例
若要建置並執行 MTRECALC 範例
開啟 MtRecalc.sln 方案。
在 [建置] 功能表上按一下 [建置]。
在 [偵錯] 功能表上,按一下 [啟動但不偵錯]。
MTRECALC 顯示能將兩個整數相加的簡單表單,模擬一張試算表,每當您或變更儲存格的內容或按一下 [立即重新計算] 時,便會重新計算。當 MTRECALC 在模擬較長的計算時,結果欄位會顯示「正在重新計算...」。您能夠按一下 [示範] 功能表中 [重新計算的速度] 來變更重新計算的時間。
按一下 [示範] 功能表中的 [背景工作執行緒] 或 [單一執行緒],比較在背景工作執行緒中重新計算和在主要應用程式使用者介面相同執行緒中重新計算的「感覺」。例如,在單執行緒示範中,您無法在 MTRECALC 的功能表進行重新計算時對它存取,但在背景工作執行緒中卻可以存取。在單一執行緒示範中,您不能在 MTRECALC 進行重新計算時更新任一個整數欄位,但在背景工作執行緒中卻可以更新。如果您在背景工作執行緒已在重新計算時更新欄位,便會放棄作用中的重新計算,然後啟動新的重新計算。
只有在背景工作執行緒正在重新計算時,才會啟動 [示範] 功能表中的 [刪除背景工作執行緒]。如果您使用 [刪除背景工作執行緒] 在完成重新計算之前中斷重新計算,則結果欄位會顯示問號 ("?")。您可以使用 [立即重新計算] 命令重新開始計算。
如果您試著要在重新計算尚未完成之前,儲存 MTRECALC 文件,將會有提示詢問「您是否要等候重新計算完成?」如果您回應是,MTRECALC 在儲存文件之前等待重新計算完成時會顯示沙漏。若要執行此示範,您可能需要使用 [重新計算的速度] 命令增加重新計算的時間,由預設的 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++ 精靈、程式庫以及編譯器方面的變更,不過還是可以示範如何完成您要進行的工作。 |