欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 關于MFC多線程編程的注意事項

 更新時間:2015年06月30日 12:42:51   投稿:hebedich  
這篇文章主要介紹了C++ 關于MFC多線程編程的注意事項的相關資料,需要的朋友可以參考下

在多線程編程中,最簡單的方法,無非就是利用 AfxBeginThread  來創(chuàng)建一個工作線程,看一下這個函數(shù)的說明:

復制代碼 代碼如下:

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

在這個說明中,除第1和第2兩個參數(shù)外,余下的參數(shù)都有默認值。所以,我們在使用的時候,是必須要指定前兩個參數(shù)的。

其中 第一個參數(shù)是 要運行的函數(shù)的名稱,光寫函數(shù)名就可以了,不能加引號。

第二個參數(shù),是指定 運行函數(shù)的 參數(shù),這個參數(shù)的類型為 LPVOID 。所以要運行的函數(shù)的在傳遞過去后,要轉(zhuǎn)化為LPVOID類型才可以。

而要運行的參數(shù)還有一個限制,那就是必須返回一個UINT類型的結(jié)果。所以要運行的函數(shù)的就有一個基本上固定的格式。

UINT RunProce(LPVOID lpParam)

在這里還需要特別說明一下,這個函數(shù)不能是實例函數(shù),也就是函數(shù)前面是不能有 類限定符:: 的。如果是靜態(tài)函數(shù)也是可以的。

在這個函數(shù)中,我們只能使用一個參數(shù),而參數(shù)的類型只能是 LPVOID ,可以用一個結(jié)構體來封閉多個參數(shù)。

余下的問題,就不是很多了。

關于 多線程,就寫到這里吧!

在多線程編程中,一個很重要的問題就是,要將線程的運行過程通知界面線程,做一些顯示方面的更新。如下載線程,在適當?shù)臅r候,可以更新界面,現(xiàn)在下載到什么進度了。等等的情況。但是在工作線程中,是不是直接操作界面線程的控件的。那怎么辦呢,只能通過自定義一個消息來解決。

工作流程,就是 在自定義線程中 通過發(fā)送一個界面上的 消息,來通知界面做一些更新操作。在這個自定義消息中,有一個細節(jié)要解決,那就是自定義消息,必須要指定接收消息的控件句柄。當然你中以使用m_pApp 直接通知主框架來解決,但是這樣解決似乎繞了一個很大的圈。其實解決的方法很簡單,那就是直接將接收消息的控件的句柄傳給自定義線程,就可以了。我們直接在線程中使用此句柄就可以解決了。

我們知道控件的基類都是 CWnd。所以我們傳遞一個CWnd的指針進去。當然還有一些其它的參數(shù)要一塊傳遞進去,那就做一個結(jié)構吧

復制代碼 代碼如下:

typedef struct{
 CString srcString;
 CString DesString;
 CWnd*    hander;
}Param;

這里我們傳遞了三個參數(shù) 兩個字符串一個指針。

我們先造一個自定義線程函數(shù)

復制代碼 代碼如下:

UINT RunProce(LPVOID lpParam)
{
    Param* par;
    CWnd* hander;
    par = (Param*)lpParam;
    hander = par->hander;
    myCopyDirectory(lpParam);
    CString str;
    str = "復制完成";
    hander->SendMessage(WM_USERMESSAGE,0,(LPARAM)&str);
    return 0;
}

在這個函數(shù)中,我們要運行由此函數(shù)組成的一個線程的話,就需要傳遞一個參數(shù)lpParam,而這個參數(shù)是由 Param 的結(jié)構體來指定。實際上是傳遞了三個參數(shù)進去。

復制代碼 代碼如下:

Param* par;
par = (Param*)lpParam;

我們會用上在的強制類型轉(zhuǎn)換的方法,就可以還原參數(shù)的值。根據(jù)這三個參數(shù)就  自定主的線程函數(shù)就可以運行了。那如何通知界面線程呢??匆幌伦远x函數(shù)里面的這一句

hander->SendMessage(WM_USERMESSAGE,0,(LPARAM)&str);

 這一句中 hander 是由結(jié)構體轉(zhuǎn)換而來的 接收消息的控件的句柄。然后調(diào)用這個控件的 SendMessage 方法,就可以向此控件發(fā)消息了。消息的內(nèi)容由后面的參數(shù)來決定

第一個參數(shù) WM_USERMESSAGE 這是一個消息的名稱。這個名稱實際上是一個數(shù)字。我們需要在 .h 文件中 指定一下如下面的格式

#define WM_USERMESSAGE 11130

后面的數(shù)字造的大一點,哈哈

第二個與第三個參數(shù),就是這個消息傳遞具體的值,如果不需要傳遞值的話,那就直接寫0吧

在這里我們想在傳遞參數(shù)的第三個參數(shù)上傳遞一個 字符串,那就是上面的寫法了。

這樣的話,在線程中發(fā)送消息的部分,就全部講完了。消息發(fā)送出去了,怎么接收呢?

這真是一個重要的問題

首先,要將消息做一下映射。消息映射的目的,就是告訴程序,當出現(xiàn)這個消息的時候,使用哪個函數(shù)進行處理。這樣的話,就首先需要一個消息映射的函數(shù)。這個消息映射的函數(shù)不是亂寫,因為要傳遞兩個參數(shù),所以這個函數(shù)需要能夠接收這兩個參數(shù)。處理函數(shù)一般這樣子寫

LRESULT CCopyfileDlg::OnProcName(WPARAM wParam, LPARAM lParam)
他奶奶的,太神奇了。返回值只能是 LRESULT 。這個不用討論吧,照著抄吧。函數(shù)名稱后面有參數(shù)兩個,這是一個實例函數(shù)。因為前面有::
兩個參數(shù)一般也寫成這個樣子的。

函數(shù)內(nèi)容,就由你的程序的功能決定了。我這里直接抄一段我自己的代碼吧

LRESULT CCopyfileDlg::OnProcName(WPARAM wParam, LPARAM lParam)
{
  // TODO: 處理用戶自定義消息
  CString* str = (CString*)lParam;
  SetDlgItemText(IDC_STATIC,*str);

  if(*str == "復制完成")
   {
     (CButton*)GetDlgItem(IDC_COPYBUT)->EnableWindow(true);
   }

  return 0;

}

這段程序是根據(jù)得到的傳遞過來的參數(shù),在界面上顯示具體的參數(shù)內(nèi)容。

SetDlgItemText(IDC_STATIC,*str);  //在靜態(tài)文本框中顯示消息。

備注:

如果要讓按鈕變成灰色的,那就使用控件的 EnableWindow 方法。

這個方法,我們說,是專門的消息處理函數(shù),那么它的聲明也比較特殊。需要這么寫

afx_msg LRESULT OnProcName(WPARAM wParam, LPARAM lParam);
將上面的內(nèi)容放在 h文件的合理位置就可以了。

現(xiàn)在消息處理函數(shù)也有了。但是怎么將映射呢?

其實在 CPP文件中,有一個由 BEGIN_MESSAGE_MAP(CCopyfileDlg, CDialog) 和END_MESSAGE_MAP() 包括的區(qū)域。這個區(qū)域就是用來定義消息映射的。

將這么一句話放在他們中間,就OK了

ON_MESSAGE(WM_USERMESSAGE,OnProcName)
這么一句話,就將 WM_USERMESSAGE 與 OnProcName 與消息處理函數(shù)結(jié)合在一起了。是不是超級簡單呀!

這樣我們的界面線程中的消息處理部分也主做好了。

當消息發(fā)送過來后,就會通過消息映射放在對應的函數(shù)中加以處理。

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。

相關文章

  • C語言循環(huán)隊列與用隊列實現(xiàn)棧問題解析

    C語言循環(huán)隊列與用隊列實現(xiàn)棧問題解析

    循環(huán)隊列又叫環(huán)形隊列,是一種特殊的隊列。循環(huán)隊列解決了隊列出隊時需要將所有數(shù)據(jù)前移一位的問題,本篇帶你一起看看循環(huán)隊列的問題和怎樣用隊列實現(xiàn)棧
    2022-04-04
  • C語言結(jié)構體struct詳解

    C語言結(jié)構體struct詳解

    C語言中,結(jié)構體類型屬于一種構造類型(其他的構造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關于C語言結(jié)構體(struct)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • C語言之飛機大戰(zhàn)游戲

    C語言之飛機大戰(zhàn)游戲

    這篇文章主要為大家詳細介紹了C語言之飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 推薦幾款實用的C++ 在線工具

    推薦幾款實用的C++ 在線工具

    這篇文章主要推薦了幾款實用的C++ 在線工具,幫助大家更好的進行c++開發(fā),感興趣的朋友可以了解下載。
    2020-10-10
  • C語言二叉排序(搜索)樹實例

    C語言二叉排序(搜索)樹實例

    這篇文章主要為大家詳細介紹了C語言二叉排序樹實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 關于C++中vector的兩個小tips分享

    關于C++中vector的兩個小tips分享

    這篇文章主要給大家介紹了關于C++中vector的兩個小tips,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Qt實現(xiàn)文本編輯器(二)

    Qt實現(xiàn)文本編輯器(二)

    這篇文章主要介紹了利用Qt實現(xiàn)的一個文本編輯器。本文將具體講解下是如何實現(xiàn)菜單欄以及工具欄上對應的需求,感興趣的可以動手試一試
    2022-01-01
  • C++中String類型的逆序方式

    C++中String類型的逆序方式

    這篇文章主要介紹了C++中String類型的逆序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言全面梳理文件操作方法

    C語言全面梳理文件操作方法

    這篇文章主要為大家詳細介紹了C語言的文件操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-05-05
  • 詳解C++的靜態(tài)內(nèi)存分配與動態(tài)內(nèi)存分配

    詳解C++的靜態(tài)內(nèi)存分配與動態(tài)內(nèi)存分配

    內(nèi)存分配 (Memory Allocation) 是指為計算機程序或服務分配物理內(nèi)存空間或虛擬內(nèi)存空間的一個過程,本文主要介紹了C++的靜態(tài)內(nèi)存分配與動態(tài)內(nèi)存分配,感興趣的同學可以參考閱讀
    2023-06-06

最新評論