最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 關(guān)于MFC多線程編程的注意事項(xiàng)

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

在多線程編程中,最簡(jiǎn)單的方法,無(wú)非就是利用 AfxBeginThread  來(lái)創(chuàng)建一個(gè)工作線程,看一下這個(gè)函數(shù)的說(shuō)明:

復(fù)制代碼 代碼如下:

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

在這個(gè)說(shuō)明中,除第1和第2兩個(gè)參數(shù)外,余下的參數(shù)都有默認(rèn)值。所以,我們?cè)谑褂玫臅r(shí)候,是必須要指定前兩個(gè)參數(shù)的。

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

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

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

UINT RunProce(LPVOID lpParam)

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

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

余下的問(wèn)題,就不是很多了。

關(guān)于 多線程,就寫到這里吧!

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

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

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

復(fù)制代碼 代碼如下:

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

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

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

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

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

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

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

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

#define WM_USERMESSAGE 11130

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

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

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

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

這真是一個(gè)重要的問(wèn)題

首先,要將消息做一下映射。消息映射的目的,就是告訴程序,當(dāng)出現(xiàn)這個(gè)消息的時(shí)候,使用哪個(gè)函數(shù)進(jìn)行處理。這樣的話,就首先需要一個(gè)消息映射的函數(shù)。這個(gè)消息映射的函數(shù)不是亂寫,因?yàn)橐獋鬟f兩個(gè)參數(shù),所以這個(gè)函數(shù)需要能夠接收這兩個(gè)參數(shù)。處理函數(shù)一般這樣子寫

LRESULT CCopyfileDlg::OnProcName(WPARAM wParam, LPARAM lParam)
他奶奶的,太神奇了。返回值只能是 LRESULT 。這個(gè)不用討論吧,照著抄吧。函數(shù)名稱后面有參數(shù)兩個(gè),這是一個(gè)實(shí)例函數(shù)。因?yàn)榍懊嬗校海?br /> 兩個(gè)參數(shù)一般也寫成這個(gè)樣子的。

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

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

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

  return 0;

}

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

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

備注:

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

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

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

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

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

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

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

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

當(dāng)消息發(fā)送過(guò)來(lái)后,就會(huì)通過(guò)消息映射放在對(duì)應(yīng)的函數(shù)中加以處理。

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

相關(guān)文章

  • C語(yǔ)言詳細(xì)分析講解關(guān)鍵字enum與sizeof及typedef的用法

    C語(yǔ)言詳細(xì)分析講解關(guān)鍵字enum與sizeof及typedef的用法

    在?C?語(yǔ)言中經(jīng)常會(huì)見到?enum、sizeof、typedef,那么我們今天就來(lái)講解下它們?nèi)齻€(gè),enum是C語(yǔ)言中的一種自定義類型,它是一種枚舉類型,sizeof是編譯器的內(nèi)置指示符,用于計(jì)算類型或變量所占內(nèi)存打小,typedef用于給一個(gè)已經(jīng)存在的數(shù)據(jù)類型重命名,本質(zhì)上不能產(chǎn)生新的類型
    2022-04-04
  • C語(yǔ)言驅(qū)動(dòng)開發(fā)之內(nèi)核文件的讀寫

    C語(yǔ)言驅(qū)動(dòng)開發(fā)之內(nèi)核文件的讀寫

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言驅(qū)動(dòng)開發(fā)中內(nèi)核文件的讀寫的系列函數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • 深入理解C/C++混合編程

    深入理解C/C++混合編程

    本篇文章是對(duì)C/C++混合編程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++的對(duì)象特性和友元你真的了解嗎

    C++的對(duì)象特性和友元你真的了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++的對(duì)象特性和友元,使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++ 中boost::share_ptr智能指針的使用方法

    C++ 中boost::share_ptr智能指針的使用方法

    這篇文章主要介紹了C++ 中boost::share_ptr智能指針的使用方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • 淺析C++中的函數(shù)重載

    淺析C++中的函數(shù)重載

    這篇文章主要介紹了淺析C++中的函數(shù)重載,在C++中,可以為兩個(gè)或兩個(gè)以上的函數(shù)提供相同的函數(shù)名稱,只要參數(shù)類型不同,或者參數(shù)類型相同而參數(shù)個(gè)數(shù)不同,又或者參數(shù)類型參數(shù)個(gè)數(shù)相同,參數(shù)次序不同,稱為函數(shù)重載,需要的朋友可以參考下
    2023-08-08
  • 用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能

    用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++string字符串拼接遇到的問(wèn)題及解決

    C++string字符串拼接遇到的問(wèn)題及解決

    這篇文章主要介紹了C++string字符串拼接遇到的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 利用C語(yǔ)言解決八皇后問(wèn)題以及解析

    利用C語(yǔ)言解決八皇后問(wèn)題以及解析

    這篇文章主要給大家介紹了關(guān)于利用C語(yǔ)言解決八皇后問(wèn)題以及解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 概述C++中的 public protected private friend關(guān)鍵字的用法

    概述C++中的 public protected private friend關(guān)鍵字的用法

    這篇文章簡(jiǎn)要概述了C++中的 public protected private friend關(guān)鍵字的用法,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-08-08

最新評(píng)論

易门县| 新泰市| 宁安市| 松潘县| 肃南| 黑龙江省| 高州市| 沙雅县| 孝义市| 正阳县| 崇左市| 宣汉县| 抚州市| 张北县| 大城县| 长治市| 芷江| 湖南省| 清流县| 松滋市| 鄢陵县| 克什克腾旗| 永嘉县| 巴林右旗| 延长县| 北宁市| 得荣县| 宁乡县| 沙雅县| 溧水县| 于田县| 浦北县| 都昌县| 贡嘎县| 阿克陶县| 思茅市| 万全县| 乐清市| 汝阳县| 积石山| 山阴县|