程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ 關於MFC多線程編程的留意事項

C++ 關於MFC多線程編程的留意事項

編輯:關於C++

C++ 關於MFC多線程編程的留意事項。本站提示廣大學習愛好者:(C++ 關於MFC多線程編程的留意事項)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 關於MFC多線程編程的留意事項正文


在多線程編程中,最簡略的辦法,不過就是應用 AfxBeginThread  來創立一個任務線程,看一下這個函數的解釋:


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兩個參數外,余下的參數都有默許值。所以,我們在應用的時刻,是必需要指定前兩個參數的。

個中 第一個參數是 要運轉的函數的稱號,光寫函數名便可以了,不克不及加引號。

第二個參數,是指定 運轉函數的 參數,這個參數的類型為 LPVOID 。所以要運轉的函數的在傳遞曩昔後,要轉化為LPVOID類型才可以。

而要運轉的參數還有一個限制,那就是必需前往一個UINT類型的成果。所以要運轉的函數的就有一個根本上固定的格局。

UINT RunProce(LPVOID lpParam)

在這裡還須要特殊解釋一下,這個函數不克不及是實例函數,也就是函數後面是不克不及有 類限制符:: 的。假如是靜態函數也是可以的。

在這個函數中,我們只能應用一個參數,而參數的類型只能是 LPVOID ,可以用一個構造體來關閉多個參數。

余下的成績,就不是許多了。

關於 多線程,就寫到這裡吧!

在多線程編程中,一個很主要的成績就是,要將線程的運轉進程告訴界面線程,做一些顯示方面的更新。以下載線程,在恰當的時刻,可以更新界面,如今下載到甚麼進度了。等等的情形。然則在任務線程中,是否是直接操作界面線程的控件的。那怎樣辦呢,只能經由過程自界說一個新聞來處理。

任務流程,就是 在自界說線程中 經由過程發送一個界面上的 新聞,來告訴界面做一些更新操作。在這個自界說新聞中,有一個細節要處理,那就是自界說新聞,必需要指定吸收新聞的控件句柄。固然你中以應用m_pApp 直接告訴主框架來處理,然則如許處理仿佛繞了一個很年夜的圈。其實處理的辦法很簡略,那就是直接將吸收新聞的控件的句柄傳給自界說線程,便可以了。我們直接在線程中應用此句柄便可以處理了。

我們曉得控件的基類都是 CWnd。所以我們傳遞一個CWnd的指針出來。固然還有一些其它的參數要一塊傳遞出來,那就做一個構造吧


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

這裡我們傳遞了三個參數 兩個字符串一個指針。

我們先造一個自界說線程函數


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;
}

在這個函數中,我們要運轉由此函數構成的一個線程的話,就須要傳遞一個參數lpParam,而這個參數是由 Param 的構造體來指定。現實上是傳遞了三個參數出來。


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

我們會用上在的強迫類型轉換的辦法,便可以復原參數的值。依據這三個參數就  自定主的線程函數便可以運轉了。那若何告訴界面線程呢。看一下自界說函數外面的這一句

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

 這一句中 hander 是由構造體轉換而來的 吸收新聞的控件的句柄。然後挪用這個控件的 SendMessage 辦法,便可以向此控件發新聞了。新聞的內容由前面的參數來決議

第一個參數 WM_USERMESSAGE 這是一個新聞的稱號。這個稱號現實上是一個數字。我們須要在 .h 文件中 指定一下以下面的格局

#define WM_USERMESSAGE 11130

前面的數字造的年夜一點,哈哈

第二個與第三個參數,就是這個新聞傳遞詳細的值,假如不須要傳遞值的話,那就直接寫0吧

在這裡我們想在傳遞參數的第三個參數上傳遞一個 字符串,那就是下面的寫法了。

如許的話,在線程中發送新聞的部門,就全體講完了。新聞發送出去了,怎樣吸收呢?

這真是一個主要的成績

起首,要將新聞做一下映照。新聞映照的目標,就是告知法式,當湧現這個新聞的時刻,應用哪一個函數停止處置。如許的話,就起首須要一個新聞映照的函數。這個新聞映照的函數不是亂寫,由於要傳遞兩個參數,所以這個函數須要可以或許吸收這兩個參數。處置函數普通如許子寫

LRESULT CCopyfileDlg::OnProcName(WPARAM wParam, LPARAM lParam)
他奶奶的,太奇異了。前往值只能是 LRESULT 。這個不消評論辯論吧,照著抄吧。函數稱號前面有參數兩個,這是一個實例函數。由於後面有::
兩個參數普通也寫成這個模樣的。

函數內容,就由你的法式的功效決議了。我這裡直接抄一段我本身的代碼吧

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;

}

這段法式是依據獲得的傳遞過去的參數,在界面上顯示詳細的參數內容。

SetDlgItemText(IDC_STATIC,*str);  //在靜態文本框中顯示新聞。

備注:

假如要讓按鈕釀成灰色的,那就應用控件的 EnableWindow 辦法。

這個辦法,我們說,是專門的新聞處置函數,那末它的聲明也比擬特別。須要這麼寫

afx_msg LRESULT OnProcName(WPARAM wParam, LPARAM lParam);
將下面的內容放在 h文件的公道地位便可以了。

如今新聞處置函數也有了。然則怎樣將映照呢?

其其實 CPP文件中,有一個由 BEGIN_MESSAGE_MAP(CCopyfileDlg, CDialog) 和END_MESSAGE_MAP() 包含的區域。這個區域就是用來界說新聞映照的。

將這麼一句話放在他們中央,就OK了

ON_MESSAGE(WM_USERMESSAGE,OnProcName)
這麼一句話,就將 WM_USERMESSAGE 與 OnProcName 與新聞處置函數聯合在一路了。是否是超等簡略呀!

如許我們的界面線程中的新聞處置部門也主做好了。

當新聞發送過去後,就會經由過程新聞映照放在對應的函數中加以處置。

以上所述就是本文的全體內容了,願望年夜家可以或許愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved