CWinThread類用法詳解+執行個體

來源:互聯網
上載者:User

標籤:mfc cwinthread

CWinThread有兩種用法,一種是輔助線程,又叫背景工作執行緒(Worker_Thread),另外一種是互動線程(User_Interface_Thread)。其中第一種用法簡單,而第二種就相對複雜了。我們來具體看一下。(筆者用的是VC2010)

 

例一:

我們建立一個Win32控制台程式空項目,右鍵點擊項目,選擇【屬性】,

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/86/wKiom1VLCzHA76uCAAMetuahrmk862.jpg" title="1.png" alt="wKiom1VLCzHA76uCAAMetuahrmk862.jpg" />

 

對項目做如上修改。

 

輸入下面的代碼:

#define _AFXDLL#include"afxwin.h"class CMyThread:public CWinThread{public:DECLARE_DYNCREATE(CMyThread)protected:virtual BOOL InitInstance();};IMPLEMENT_DYNCREATE(CMyThread,CWinThread)BOOL CMyThread::InitInstance(){//這裡可以添加線程處理代碼,你想在這裡做什麼都可以!_tprintf(L"Hello CWinThread as Worker Thread\n");//注意,這裡必須返回FALSE,這是區別於User_Interface_Thread的地方!如果這裡返回//TRUE,那麼InitInstance函數執行完畢後,MFC架構將會調用CMyThread類的虛擬函數Run()//Run函數執行的是訊息迴圈,在背景工作執行緒中,沒有視窗,何來訊息迴圈呢,所以這裡一定要返回FALSE,//記住了!!!return FALSE;}int _tmain(){//建立一個新線程CWinThread* p=AfxBeginThread(RUNTIME_CLASS(CMyThread));_gettchar();return 0;}



這裡面應該注意的問題,已經在程式的注釋中給出了。在真正的MFC中使用這個類,用法沒有任何區別,我們重點看User_Interface_Thread的用法。

 

例子二:

首先建立一個MFC程式,選擇對話方塊程式直接點完成。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/86/wKiom1VLC3qCaa48AAH8V5Qjmng543.jpg" style="float:none;" title="2.PNG" alt="wKiom1VLC3qCaa48AAH8V5Qjmng543.jpg" />


這樣,系統會給我們產生一個對話方塊,直接將對話方塊資源修改成下面的樣子:


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/86/wKiom1VLC3yy20L_AACe00-YeAs071.jpg" style="float:none;" title="4.PNG" alt="wKiom1VLC3yy20L_AACe00-YeAs071.jpg" />


雙擊【確定】,得到

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/82/wKioL1VLDO_D8pLdAACP_h4VVHI122.jpg" style="float:none;" title="5.PNG" alt="wKioL1VLDO_D8pLdAACP_h4VVHI122.jpg" />

點擊【項目】菜單,選擇【添加類】

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/86/wKiom1VLC37xiUQ6AAKpsUmsxvA685.jpg" title="6.PNG" alt="wKiom1VLC37xiUQ6AAKpsUmsxvA685.jpg" />

選擇MFC類。



650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/82/wKioL1VLDPKx_kiRAAGcaqt_E7E524.jpg" style="float:none;" title="7.PNG" alt="wKioL1VLDPKx_kiRAAGcaqt_E7E524.jpg" />


 

【類名】:CMyThread     【基類名】:CWinThread  直接【完成】。

 

系統自動產生CMyThread類,一共兩個檔案MyThread.h和MyThread.cpp

 

在MyThread.cpp中,添加如下代碼:

// MyThread.cpp : 實現檔案//#include "stdafx.h"#include "tt、.h"#include "MyThread.h"// CMyThreadLRESULT CALLBACK MainWndProc(    HWND hwnd,        // handle to window    UINT uMsg,        // message identifier    WPARAM wParam,    // first message parameter    LPARAM lParam)    // second message parameter{      switch (uMsg)     {         case WM_CREATE:             // Initialize the window.             return 0;          case WM_PAINT:             // Paint the window‘s client area.             return 0;          case WM_SIZE:             // Set the size and position of the window.             return 0;          case WM_DESTROY:             // Clean up window-specific data objects. PostQuitMessage(0);            return 0;          //         // Process other messages.         //          default:             return DefWindowProc(hwnd, uMsg, wParam, lParam);     }     return 0; } // CMyThreadIMPLEMENT_DYNCREATE(CMyThread, CWinThread)CMyThread::CMyThread(){}CMyThread::~CMyThread(){}BOOL CMyThread::InitInstance(){// TODO: 在此執行任意逐線程初始化WNDCLASS wc,wc1;      // Register the main window class.     wc.style = CS_HREDRAW | CS_VREDRAW;     wc.lpfnWndProc = (WNDPROC) MainWndProc;     wc.cbClsExtra = 0;     wc.cbWndExtra = 0; wc.hInstance = ::GetModuleHandle(NULL);     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);     wc.hCursor = LoadCursor(NULL, IDC_ARROW);     wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);     wc.lpszMenuName =NULL;     wc.lpszClassName = L"ydm";  if(!GetClassInfo(GetModuleHandle(NULL),L"ydm",&wc1)){if (!RegisterClass(&wc)) return FALSE; }HWND hwnd=CreateWindow(L"ydm",NULL,WS_OVERLAPPEDWINDOW,0,0,500,300,NULL,NULL,::GetModuleHandle(NULL),NULL);ShowWindow(hwnd,SW_SHOW);UpdateWindow(hwnd);return TRUE;}int CMyThread::ExitInstance(){// TODO: 在此執行任意逐線程清理return CWinThread::ExitInstance();}BEGIN_MESSAGE_MAP(CMyThread, CWinThread)END_MESSAGE_MAP()// CMyThread 訊息處理常式

在Dlg的cpp類中,添加如下代碼:

// tt、.cpp : 定義應用程式的類行為。//#include "stdafx.h"#include "tt、.h"#include "tt、Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// Ctt、AppBEGIN_MESSAGE_MAP(Ctt、App, CWinApp)ON_COMMAND(ID_HELP, &CWinApp::OnHelp)END_MESSAGE_MAP()// Ctt、App 構造Ctt、App::Ctt、App(){// 支援重新啟動管理器m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;// TODO: 在此處添加構造代碼,// 將所有重要的初始化放置在 InitInstance 中}// 唯一的一個 Ctt、App 對象Ctt、App theApp;// Ctt、App 初始化BOOL Ctt、App::InitInstance(){// 如果一個運行在 Windows XP 上的應用程式資訊清單指定要// 使用 ComCtl32.dll 版本 6 或更高版本來啟用可視化方式,//則需要 InitCommonControlsEx()。否則,將無法建立視窗。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 將它設定為包括所有要在應用程式中使用的// 公用控制項類。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();AfxEnableControlContainer();// 建立 shell 管理器,以防對話方塊包含// 任何 shell 樹狀檢視控制項或 shell 列表視圖控制項。CShellManager *pShellManager = new CShellManager;// 標準初始化// 如果未使用這些功能並希望減小// 最終可執行檔的大小,則應移除下列// 不需要的特定初始化常式// 更改用於儲存設定的登錄機碼// TODO: 應適當修改該字串,// 例如修改為公司或組織名SetRegistryKey(_T("應用程式嚮導產生的本地應用程式"));Ctt、Dlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置處理何時用//  “確定”來關閉對話方塊的代碼}else if (nResponse == IDCANCEL){// TODO: 在此放置處理何時用//  “取消”來關閉對話方塊的代碼}// 刪除上面建立的 shell 管理器。if (pShellManager != NULL){delete pShellManager;}// 由於對話方塊已關閉,所以將返回 FALSE 以便退出應用程式,//  而不是啟動應用程式的訊息泵。return FALSE;}編譯並執行,在對話方塊上點擊【確定】,會出來一個新的對話方塊。這是User_Interface_Thread的使用方法。我們可以將以上兩端代碼中的粗體代碼,換成我們想要的任何代碼。


本文出自 “C” 部落格,請務必保留此出處http://5412097.blog.51cto.com/5402097/1643861

CWinThread類用法詳解+執行個體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.