日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程编程之二——MFC中的多线程开发

發布時間:2025/3/12 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程编程之二——MFC中的多线程开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

五、MFC對多線程編程的支持

  MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程。二者的主要區別在于工作者線程沒有消息循環,而用戶界面線程有自己的消息隊列和消息循環。
  工作者線程沒有消息機制,通常用來執行后臺計算和維護任務,如冗長的計算過程,打印機的后臺打印等。用戶界面線程一般用于處理獨立于其他線程執行之外的用戶輸入,響應用戶及系統所產生的事件和消息等。但對于Win32的API編程而言,這兩種線程是沒有區別的,它們都只需線程的啟動地址即可啟動線程來執行任務。
  在MFC中,一般用全局函數AfxBeginThread()來創建并初始化一個線程的運行,該函數有兩種重載形式,分別用于創建工作者線程和用戶界面線程。兩種重載函數原型和參數分別說明如下:

(1) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam, nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0, DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

PfnThreadProc:指向工作者線程的執行函數的指針,線程函數原型必須聲明如下:

UINT ExecutingFunction(LPVOID pParam);

請注意,ExecutingFunction()應返回一個UINT類型的值,用以指明該函數結束的原因。一般情況下,返回0表明執行成功。

  • pParam:傳遞給線程函數的一個32位參數,執行函數將用某種方式解釋該值。它可以是數值,或是指向一個結構的指針,甚至可以被忽略;
  • nPriority:線程的優先級。如果為0,則線程與其父線程具有相同的優先級;
  • nStackSize:線程為自己分配堆棧的大小,其單位為字節。如果nStackSize被設為0,則線程的堆棧被設置成與父線程堆棧相同大小;
  • dwCreateFlags:如果為0,則線程在創建后立刻開始執行。如果為CREATE_SUSPEND,則線程在創建后立刻被掛起;
  • lpSecurityAttrs:線程的安全屬性指針,一般為NULL;
(2) CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass, int nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0, DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

?

  pThreadClass 是指向 CWinThread 的一個導出類的運行時類對象的指針,該導出類定義了被創建的用戶界面線程的啟動、退出等;其它參數的意義同形式1。使用函數的這個原型生成的線程也有消息機制,在以后的例子中我們將發現同主線程的機制幾乎一樣。

下面我們對CWinThread類的數據成員及常用函數進行簡要說明。

  • m_hThread:當前線程的句柄;
  • m_nThreadID:當前線程的ID;
  • m_pMainWnd:指向應用程序主窗口的指針
BOOL CWinThread::CreateThread(DWORD dwCreateFlags=0,UINT nStackSize=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

  該函數中的dwCreateFlags、nStackSize、lpSecurityAttrs參數和API函數CreateThread中的對應參數有相同含義,該函數執行成功,返回非0值,否則返回0。
  一般情況下,調用AfxBeginThread()來一次性地創建并啟動一個線程,但是也可以通過兩步法來創建線程:首先創建CWinThread類的一個對象,然后調用該對象的成員函數CreateThread()來啟動該線程。

virtual BOOL CWinThread::InitInstance();

  重載該函數以控制用戶界面線程實例的初始化。初始化成功則返回非0值,否則返回0。用戶界面線程經常重載該函數,工作者線程一般不使用InitInstance()。

virtual int CWinThread::ExitInstance();

  在線程終結前重載該函數進行一些必要的清理工作。該函數返回線程的退出碼,0表示執行成功,非0值用來標識各種錯誤。同InitInstance()成員函數一樣,該函數也只適用于用戶界面線程。

六、MFC多線程編程實例

  在Visual C++ 6.0編程環境中,我們既可以編寫C風格的32位Win32應用程序,也可以利用MFC類庫編寫C++風格的應用程序,二者各有其優缺點。基于Win32的應用程序執行代碼小巧,運行效率高,但要求程序員編寫的代碼較多,且需要管理系統提供給程序的所有資源;而基于MFC類庫的應用程序可以快速建立起應用程序,類庫為程序員提供了大量的封裝類,而且Developer Studio為程序員提供了一些工具來管理用戶源程序,其缺點是類庫代碼很龐大。由于使用類庫所帶來的快速、簡捷和功能強大等優越性,因此除非有特殊的需要,否則Visual C++推薦使用MFC類庫進行程序開發。

我們知道,MFC中的線程分為兩種:用戶界面線程和工作者線程。我們將分別舉例說明。

用 MFC 類庫編程實現工作者線程

例程5 MultiThread5

為了與Win32 API對照,我們使用MFC 類庫編程實現例程3 MultiThread3。

  • 建立一個基于對話框的工程MultiThread5,在對話框IDD_MULTITHREAD5_DIALOG中加入一個編輯框IDC_MILLISECOND,一個按鈕IDC_START,標題為“開始” ,一個進度條IDC_PROGRESS1;
  • 打開ClassWizard,為編輯框IDC_MILLISECOND添加int型變量m_nMilliSecond,為進度條IDC_PROGRESS1添加CProgressCtrl型變量m_ctrlProgress;
  • 在MultiThread5Dlg.h文件中添加一個結構的定義: struct threadInfo{UINT nMilliSecond;CProgressCtrl* pctrlProgress;}; 線程函數的聲明: UINT ThreadFunc(LPVOID lpParam);

    注意,二者應在類CMultiThread5Dlg的外部。

    在類CMultiThread5Dlg內部添加protected型變量:

    CWinThread* pThread;
  • 在MultiThread5Dlg.cpp文件中進行如下操作:定義公共變量: threadInfo Info;

    雙擊按鈕IDC_START,添加相應消息處理函數:

    void CMultiThread5Dlg::OnStart() {// TODO: Add your control notification handler code hereUpdateData(TRUE);Info.nMilliSecond=m_nMilliSecond;Info.pctrlProgress=&m_ctrlProgress;pThread=AfxBeginThread(ThreadFunc,&Info);} 在函數BOOL CMultiThread3Dlg::OnInitDialog()中添加語句: {……// TODO: Add extra initialization herem_ctrlProgress.SetRange(0,99);m_nMilliSecond=10;UpdateData(FALSE);return TRUE; // return TRUE unless you set the focus to a control} 添加線程處理函數: UINT ThreadFunc(LPVOID lpParam){threadInfo* pInfo=(threadInfo*)lpParam;for(int i=0;i<100;i++){int nTemp=pInfo->nMilliSecond;pInfo->pctrlProgress->SetPos(i);Sleep(nTemp);}return 0;}
  • 用 MFC 類庫編程實現用戶界面線程

    創建用戶界面線程的步驟:

  • 使用ClassWizard創建類CWinThread的派生類(以CUIThread類為例) class CUIThread : public CWinThread{DECLARE_DYNCREATE(CUIThread)protected:CUIThread(); // protected constructor used by dynamic creation// Attributespublic:// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CUIThread)public:virtual BOOL InitInstance();virtual int ExitInstance();//}}AFX_VIRTUAL// Implementationprotected:virtual ~CUIThread();// Generated message map functions//{{AFX_MSG(CUIThread)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSGDECLARE_MESSAGE_MAP()};
  • 重載函數InitInstance()和ExitInstance()。 BOOL CUIThread::InitInstance(){CFrameWnd* wnd=new CFrameWnd;wnd->Create(NULL,"UI Thread Window");wnd->ShowWindow(SW_SHOW);wnd->UpdateWindow();m_pMainWnd=wnd;return TRUE;} 創建新的用戶界面線程 void CUIThreadDlg::OnButton1() {CUIThread* pThread=new CUIThread();pThread->CreateThread();} 請注意以下兩點:

    A、在UIThreadDlg.cpp的開頭加入語句: #include "UIThread.h" B、把UIThread.h中類CUIThread()的構造函數的特性由 protected 改為 public。

      用戶界面線程的執行次序與應用程序主線程相同,首先調用用戶界面線程類的InitInstance()函數,如果返回TRUE,繼續調用線程的Run()函數,該函數的作用是運行一個標準的消息循環,并且當收到WM_QUIT消息后中斷,在消息循環過程中,Run()函數檢測到線程空閑時(沒有消息),也將調用OnIdle()函數,最后Run()函數返回,MFC調用ExitInstance()函數清理資源。
      你可以創建一個沒有界面而有消息循環的線程,例如:你可以從CWinThread派生一個新類,在InitInstance函數中完成某項任務并返回FALSE,這表示僅執行InitInstance函數中的任務而不執行消息循環,你可以通過這種方法,完成一個工作者線程的功能。

  • 例程6 MultiThread6

  • 建立一個基于對話框的工程MultiThread6,在對話框IDD_MULTITHREAD6_DIALOG中加入一個按鈕IDC_UI_THREAD,標題為“用戶界面線程”
  • 右擊工程并選中“New Class…”為工程添加基類為CWinThread派生線程類CUIThread。
  • 給工程添加新對話框IDD_UITHREADDLG,標題為“線程對話框”。
  • 為對話框IDD_UITHREADDLG創建一個基于CDialog的類CUIThreadDlg。使用ClassWizard為CUIThreadDlg類添加WM_LBUTTONDOWN消息的處理函數OnLButtonDown,如下: void CUIThreadDlg::OnLButtonDown(UINT nFlags, CPoint point) {AfxMessageBox("You Clicked The Left Button!");CDialog::OnLButtonDown(nFlags, point);}
  • 在UIThread.h中添加 #include "UIThreadDlg.h" 并在CUIThread類中添加protected變量CUIThread m_dlg: class CUIThread : public CWinThread{DECLARE_DYNCREATE(CUIThread)protected:CUIThread(); // protected constructor used by dynamic creation// Attributespublic:// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CUIThread)public:virtual BOOL InitInstance();virtual int ExitInstance();//}}AFX_VIRTUAL// Implementationprotected:CUIThreadDlg m_dlg;virtual ~CUIThread();// Generated message map functions//{{AFX_MSG(CUIThread)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSGDECLARE_MESSAGE_MAP()};
  • 分別重載InitInstance()函數和ExitInstance()函數: BOOL CUIThread::InitInstance(){m_dlg.Create(IDD_UITHREADDLG);m_dlg.ShowWindow(SW_SHOW);m_pMainWnd=&m_dlg;return TRUE;}int CUIThread::ExitInstance(){m_dlg.DestroyWindow();return CWinThread::ExitInstance();}
  • 雙擊按鈕IDC_UI_THREAD,添加消息響應函數: void CMultiThread6Dlg::OnUiThread() {CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CUIThread));} 并在MultiThread6Dlg.cpp的開頭添加: #include "UIThread.h"
  •   好了,編譯并運行程序吧。每單擊一次“用戶界面線程”按鈕,都會彈出一個線程對話框,在任何一個線程對話框內按下鼠標左鍵,都會彈出一個消息框。

    總結

    以上是生活随笔為你收集整理的多线程编程之二——MFC中的多线程开发的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美视频不卡 | 国产情侣小视频 | 男女插插插视频 | 国产福利视频一区二区 | 黑丝一区 | 日本内谢少妇xxxxx少交 | 日韩免费一级 | caoporn免费在线 | 操一操干一干 | 免费黄色网址视频 | 天天色棕合合合合合合合 | av资源网址 | 黄色3级视频 | 麻豆精品一区二区三区 | 日本十大三级艳星 | 欧美mv日韩mv国产 | 波多野结衣一区二区三区四区 | 人与性动交zzzzbbbb | 99久久99久久精品国产片果冰 | 国产骚b | 久久久久久久成人 | 竹菊影视一区二区三区 | 日韩二区 | 天天夜夜爽 | 精品人妻伦一二三区久 | 国产成人在线免费观看 | 亚洲一区二区不卡在线观看 | 日本jizz在线观看 | 999热视频 | 成人综合一区 | 黄色免费网页 | 500部大龄熟乱视频 亚洲乱码精品 | 久久99草 | 久久爱伊人 | 国产美女视频一区 | 啪视频免费 | 国产又白又嫩又爽又黄 | 中国浓毛少妇毛茸茸 | 久久精品精品 | 日本在线一区 | 欧美贵妇videos办公室 | 东京热加勒比无码少妇 | 欧美a级在线观看 | 亚洲在线观看av | 欧美xxx性| 中文字幕日本在线 | 在线视频一区二区三区四区 | 日韩网红少妇无码视频香港 | 69福利网| xxx视频在线观看 | 动漫一区二区三区 | 激情亚洲视频 | 老司机在线永久免费观看 | 日本一区二区免费在线观看 | 国产吞精囗交久久久 | 全国探花| 久操免费在线 | 五月天六月婷 | 尤物自拍 | 国产100页| 热热99| 91免费高清 | 亚洲影院在线观看 | 日本三级吃奶头添泬无码苍井空 | 欧美经典一区二区 | 火影忍者羞羞漫画 | 噜噜视频 | 黄网站在线观看 | 国产精品香蕉 | 免费视频成人 | 免费黄色短片 | 欧美日韩在线视频播放 | 国产尤物在线 | 国产中文字幕在线观看 | 美女脱光衣服让男人捅 | 久久精品无码一区 | 国产偷怕 | 天堂国产精品 | 91精品又粗又猛又爽 | 伊人手机在线视频 | 午夜激情亚洲 | 日本少妇大战黑人 | 很黄很色的视频 | 精品一区二区三区免费视频 | 青青射 | 欧美精品午夜 | 人妻av中文系列 | 国产高清免费在线播放 | 69久久久| aaaa黄色片 | 一区小视频| 美女被捅个不停 | 精品一区二区人妻 | 91精品国产综合久久精品 | 欧美人体视频一区二区三区 | 精品国产中文字幕 | 国产精品国产av | 狠狠干婷婷 | 精品不卡在线 |