日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

MFC不能多线程操作控件的原因

發(fā)布時(shí)間:2023/12/18 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC不能多线程操作控件的原因 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(duì)于大多數(shù)mfc對(duì)象,請(qǐng)不要在線程間傳遞它們,不管是棧上的還是堆上的!原因如下:

??mfc的大多數(shù)類不是線程安全的,調(diào)用傳入對(duì)象的成員函數(shù)可能不會(huì)報(bào)錯(cuò),但是未必能達(dá)到程序預(yù)定的功能!

??mfc與界面有關(guān)的類,其大多數(shù)成員方法都是通過(guò)sendmessage實(shí)現(xiàn)的,如果消息處理函數(shù)本身不是線程安全的,你從工作線程中調(diào)用這些方法遲早會(huì)同你界面線程的用戶消息響應(yīng)發(fā)生沖突;

??對(duì)于CWnd相關(guān)的類,即使傳入窗口句柄,有時(shí)操作也會(huì)引起異常(ASSERT異常):通過(guò)句柄獲取窗口對(duì)象并且調(diào)用其成員函數(shù)或者成員變量!因?yàn)樵搶?duì)象是臨時(shí)對(duì)象,訪問(wèn)其成員變量沒有意義,訪問(wèn)其成員函數(shù)可能會(huì)拋出異常!

??不能在線程間傳遞mfc對(duì)象的詳細(xì)分析很麻煩,涉及到MFC程序中的三種狀態(tài):模塊狀態(tài)、進(jìn)程狀態(tài)以及線程狀態(tài)!

??下面轉(zhuǎn)載了相關(guān)的文章,原文:《MFC多線程編程》

表現(xiàn)——錯(cuò)誤示例

關(guān)于啟動(dòng)線程時(shí)傳輸窗口對(duì)象(指針?句柄?)的問(wèn)題:

在選擇菜單中的開始線程后:

void cmainframe::onmenu_start() {... afxbeginthread(mythread, this); ... }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

線程函數(shù)如下:

uint mythread(lpvoid pparam) {cmainframe* pmainfrm = (cmainframe *)pparam; ... }
  • 1
  • 2
  • 3
  • 4
  • 5

問(wèn)題一:
??這樣的代碼是不是有問(wèn)題? (文檔中說(shuō)線程間不能直接傳輸mfc對(duì)象的指針,應(yīng)該通過(guò)傳輸句柄實(shí)現(xiàn))

問(wèn)題二:
??這樣使用開始好像沒有問(wèn)題,直接通過(guò)pmainfrm訪問(wèn)窗口中的view都正常。 但發(fā)現(xiàn)訪問(wèn)狀態(tài)條時(shí):

pmainfrm->m_wndstatusbar.setpanetext(2, "test);
  • 1

出現(xiàn)debug assertion failed!(在窗口線程中沒有問(wèn)題) 位置是wincore.cpp中的

assert((p = pmap->lookuppermanent(m_hwnd)) != null || (p = pmap->lookuptemporary(m_hwnd)) != null);
  • 1
  • 2

??為什么訪問(wèn)view能正常,但訪問(wèn)狀態(tài)條時(shí)不可以呢?

問(wèn)題三:
??如果通過(guò)傳輸句柄實(shí)現(xiàn),怎樣做呢?我用下面的代碼執(zhí)行時(shí)有問(wèn)題:

void cmainframe::onmenu_start() { ... hwnd hwnd = getsafehwnd(); afxbeginthread(mythread, hwnd); ... } uint mythread(lpvoid pparam) { cmainframe* pmainfrm = (cmainframe *)(cwnd::fromhandle((hwnd)pparam)); ... }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

??執(zhí)行時(shí)通過(guò)線程中得到pmainfrm,訪問(wèn)其成員時(shí)不正常。

網(wǎng)友:hewwatt大致原因解釋如下:

??mfc的大多數(shù)類不是線程安全的,cwnd及其消息路由是其中之最
??mfc界面類的大多數(shù)方法,最后都是通過(guò)sendmessage實(shí)現(xiàn)的,而消息處理的過(guò)程中會(huì)引發(fā)其他消息的發(fā)送及處理。如果消息處理函數(shù)本身不是線程安全的你從工作線程中調(diào)用這些方法遲早會(huì)同你界面線程的用戶消息響應(yīng)發(fā)生沖突。
??cxxxx::fromhandle會(huì)根據(jù)調(diào)用者所在線程查表,如果查不到用戶創(chuàng)建的cxxxx對(duì)應(yīng)對(duì)象,它會(huì)創(chuàng)建一個(gè)臨時(shí)對(duì)象出來(lái)。由于你在工作線程中調(diào)用該方法,當(dāng)然不可能查到界面主線程中你所建立起來(lái)的那個(gè)對(duì)象了。這時(shí)mfc會(huì)你創(chuàng)建一個(gè)臨時(shí)對(duì)象并返回給你,你根本不可能期望它的成員變量會(huì)是有意義的。 所以要用 也只能用cwnd::fromhandle,因?yàn)樗话粋€(gè)m_hwnd成員。 不過(guò),要記住跨線程直接或間接地調(diào)用::sendmessage,通常都是行為不可預(yù)測(cè)的。

原因分析:

??MFC界面包裝類(多線程時(shí)成員函數(shù)調(diào)用的斷言失敗)
經(jīng)常在論壇上看到如下的問(wèn)題:

DWORD WINAPI ThreadProc( void *pData ) // 線程函數(shù)(比如用于從COM口獲取數(shù)據(jù)) {// 數(shù)據(jù)獲取循環(huán)// 數(shù)據(jù)獲得后放在變量i中CAbcDialog *pDialog = reinterpret_cast< CAbcDialog* >( pData );ASSERT( pDialog ); // 此處如果ASSERT_VALID( pDialog )將斷言失敗pDialog->m_Data = i;pDialog->UpdateData( FALSE ); // UpdateData內(nèi)部ASSERT_VALID( this )斷言失敗… } BOOL CAbcDialog::OnInitDialog() {CDialog::OnInitDialog();// 其他初始化代碼CreateThread( NULL, 0, ThreadProc, this, 0, NULL ); // 創(chuàng)建線程return TRUE; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

??注意上面注釋中的兩處斷言失敗,本文從MFC底層的實(shí)現(xiàn)來(lái)解釋為什么會(huì)斷言失敗,并說(shuō)明MFC為什么要這樣實(shí)現(xiàn)及相應(yīng)的處理辦法。
??在說(shuō)明MFC界面包裝類的底層實(shí)現(xiàn)之前,由于其和窗口有關(guān),故先講解窗口類這個(gè)基礎(chǔ)知識(shí)以為后面做鋪墊。

窗口類

??窗口類是一個(gè)結(jié)構(gòu),其一個(gè)實(shí)例代表著一個(gè)窗口類型,與C++中的類的概念非常相近(雖然其表現(xiàn)形式完全不同,C++的類只不過(guò)是內(nèi)存布局和其上的操作這個(gè)概念的類型),故被稱作為窗口類。
??窗口是具有設(shè)備操作能力的邏輯概念,即一種能操作設(shè)備(通常是顯示器)的東西。由于窗口是窗口類的實(shí)例,就象C++中的一個(gè)類的實(shí)例,是可以具有成員函數(shù)的(雖然表現(xiàn)形式不同),但一定要明確窗口的目的——操作設(shè)備(這點(diǎn)也可以從Microsoft針對(duì)窗口所制訂的API的功能看出,主要出于對(duì)設(shè)備操作的方便)。因此不應(yīng)因?yàn)槠渚哂谐蓡T函數(shù)的功能而將窗口用于功能對(duì)象的創(chuàng)建,這雖然不錯(cuò),但是嚴(yán)重違反了語(yǔ)義的需要(關(guān)于語(yǔ)義,可參考我的另一篇文章——《語(yǔ)義的需要》),是不提倡的,但卻由于MFC界面包裝類的加入導(dǎo)致大多數(shù)程序員經(jīng)常將邏輯混入界面。
??窗口類是個(gè)結(jié)構(gòu),其中的大部分成員都沒什么重要意義,只是Microsoft一相情愿制訂的,如果不想使用界面API(Windows User Interface API),可以不管那些成員。其中只有一個(gè)成員是重要的——lpfnWndProc,消息處理函數(shù)。
??外界(使用窗口的代碼)只能通過(guò)消息操作窗口,這就如同C++中編寫的具有良好的面向?qū)ο箫L(fēng)格的類的實(shí)例只能通過(guò)其公共成員函數(shù)對(duì)其進(jìn)行操作。因此消息處理函數(shù)就代表了一個(gè)窗口的一切(忽略窗口類中其他成員的作用)。很容易發(fā)現(xiàn),窗口這個(gè)實(shí)例只具有成員函數(shù)(消息處理函數(shù)),不具有成員變量,即沒有一塊特定內(nèi)存和一特定的窗口相關(guān)聯(lián),則窗口將不能具有狀態(tài)(Windows還是提供了Window Properties API來(lái)緩和這種狀況)。這也正是上面問(wèn)題發(fā)生的根源。
??為了處理窗口不能具有狀態(tài)的問(wèn)題(這其實(shí)正是Windows靈活的表現(xiàn)),可以有很多種方法,而MFC出于能夠很容易的對(duì)已有窗口類進(jìn)行擴(kuò)展,選擇了使用一個(gè)映射將一個(gè)窗口句柄(窗口的唯一標(biāo)示符)和一個(gè)內(nèi)存塊進(jìn)行綁定,而這塊內(nèi)存塊就是我們熟知的MFC界面包裝類(從CWnd開始派生延續(xù))的實(shí)例。

MFC狀態(tài)

??狀態(tài)就是實(shí)例通過(guò)某種手段使得信息可以跨時(shí)間段重現(xiàn),C++的類的實(shí)例就是由外界通過(guò)公共成員函數(shù)改變實(shí)例的成員變量的值以實(shí)現(xiàn)具有狀態(tài)的效果。在MFC 中,具有三種狀態(tài):模塊狀態(tài)、進(jìn)程狀態(tài)、線程狀態(tài)。分別為模塊、進(jìn)程和線程這三種實(shí)例的狀態(tài)。由于代碼是由線程運(yùn)行,且和另外兩個(gè)的關(guān)系也很密切,因此也被稱作本地?cái)?shù)據(jù)。

模塊本地?cái)?shù)據(jù)

??具有模塊本地性的變量。模塊指一個(gè)加載到進(jìn)程虛擬內(nèi)存空間中的PE文件,即exe文件本身和其加載的dll文件。而模塊本地性即同樣的指針,根據(jù)代碼從不同的模塊執(zhí)行而訪問(wèn)不同的內(nèi)存空間。這其實(shí)只用每個(gè)模塊都聲明一個(gè)全局變量,而前面的“代碼”就在MFC庫(kù)文件中,然后通過(guò)一個(gè)切換的過(guò)程(將欲使用的模塊的那個(gè)全局變量的地址賦給前述的指針)即可實(shí)現(xiàn)模塊本地性。MFC中,這個(gè)過(guò)程是通過(guò)調(diào)用AfxSetModuleState來(lái)切換的,而通常都使用 AFX_MANAGE_STATE這個(gè)宏來(lái)處理,因此下面常見的語(yǔ)句就是用于模塊狀態(tài)的切換的:

AFX_MANAGE_STATE( AfxGetStaticModuleState() );
  • 1

??MFC中定義了一個(gè)結(jié)構(gòu)(AFX_MODULE_STATE),其實(shí)例具有模塊本地性,記錄了此模塊的全局應(yīng)用程序?qū)ο笾羔槨①Y源句柄等模塊級(jí)的全局變量。其中有一個(gè)成員變量是線程本地?cái)?shù)據(jù),類型為AFX_MODULE_THREAD_STATE,其就是本文問(wèn)題的關(guān)鍵。

進(jìn)程本地?cái)?shù)據(jù)

??具有進(jìn)程本地性的變量。與模塊本地性相同,即同一個(gè)指針,在不同進(jìn)程中指向不同的內(nèi)存空間。這一點(diǎn)Windows本身的虛擬內(nèi)存空間這個(gè)機(jī)制已經(jīng)實(shí)現(xiàn)了,不過(guò)在dll中定義的全局變量,如果dll支持Win32s,則其是共享其全局變量的,即不同的進(jìn)程加載了同一dll將訪問(wèn)同一內(nèi)存。Win32s是為了那些基于Win32的應(yīng)用程序能在Windows 3.1上運(yùn)行,由于Windows 3.1是16位操作系統(tǒng),早已被淘汰,而現(xiàn)行的dll模型其本身就已經(jīng)實(shí)現(xiàn)了進(jìn)程本地性(不過(guò)還是可以通過(guò)共享節(jié)來(lái)實(shí)現(xiàn)Win32s中的dll的效果),因此進(jìn)程狀態(tài)其實(shí)就是一全局變量。
??MFC中作為本地?cái)?shù)據(jù)的結(jié)構(gòu)有很多,_AFX_WIN_STATE、_AFX_DEBUG_STATE、_AFX_DB_STATE等,都是MFC內(nèi)部自己使用的具有進(jìn)程本地性的全局變量。

線程本地?cái)?shù)據(jù)

??具有線程本地性的變量。如上,即同一個(gè)指針,不同的線程將會(huì)訪問(wèn)不同的內(nèi)存空間。這點(diǎn)MFC是通過(guò)線程本地存儲(chǔ)(TLS——Thread Local Storage,其使用方法由于與本文無(wú)關(guān),在此不表)實(shí)現(xiàn)的。
??MFC中定義了一個(gè)結(jié)構(gòu)(_AFX_THREAD_STATE)以記錄某些線程級(jí)的全局變量,如最近一次的模塊狀態(tài)指針,最近一次的消息等。

模塊線程狀態(tài)

??MFC中定義的一個(gè)結(jié)構(gòu)(AFX_MODULE_THREAD_STATE),其實(shí)例即具有線程本地性又具有模塊本地性。也就是說(shuō)不同的線程從同一模塊中和同一線程從不同模塊中訪問(wèn)MFC庫(kù)函數(shù)都將導(dǎo)致操作不同的內(nèi)存空間。其應(yīng)用在AFX_MODULE_STATE中,記錄一些線程相關(guān)但又模塊級(jí)的數(shù)據(jù),如本文的重點(diǎn)——窗口句柄映射。

包裝類對(duì)象和句柄映射

??句柄映射——CHandleMap,MFC提供的一個(gè)底層輔助類,程序員是不應(yīng)該直接使用它的。其有兩個(gè)重要的成員變量:CMapPtrToPtr m_permanentMap, m_temporaryMap;。分別記錄永久句柄綁定和臨時(shí)句柄綁定。前面說(shuō)過(guò),MFC使用一個(gè)映射將窗口句柄和其包裝類的實(shí)例綁定在一起,m_permanentMap和m_temporaryMap就是這個(gè)映射,分別映射永久包裝類對(duì)象和臨時(shí)包裝類對(duì)象,而在前面提到過(guò)的 AFX_MODULE_THREAD_STATE中就有一個(gè)成員變量:CHandleMap* m_pmapHWND;(之所以是CHandleMap*是使用懶惰編程法,盡量節(jié)約資源)以專門完成HWND的綁定映射,除此以外還有如 m_pmapHDC、m_pmapHMENU等成員變量以分別實(shí)現(xiàn)HDC、HMENU的綁頂映射。而為什么這些映射要放在模塊線程狀態(tài)而不放在線程狀態(tài)或模塊狀態(tài)是很明顯的——這些包裝類包裝的句柄都是和線程相關(guān)的(如HWND只有創(chuàng)建它的線程才能接收其消息)且這個(gè)模塊中的包裝類對(duì)象可能不同于另一個(gè)模塊的(如包裝類是某個(gè)DLL中專門派生的一個(gè)類,如a.dll中定義的CAButton的實(shí)例和b.dll中定義的CBButton的實(shí)例如果同時(shí)在一個(gè)線程中。此時(shí)線程卸載了a.dll,然后CAButton的實(shí)例得到消息并進(jìn)行處理,將發(fā)生嚴(yán)重錯(cuò)誤——類代碼已經(jīng)被卸載掉了)。
??包裝類存在的意義有二:包裝對(duì)HWND的操作以加速代碼的編寫和提供窗口子類化(不是超類化)的效果以派生窗口類。包裝類對(duì)象針對(duì)線程分為兩種:永久包裝類對(duì)象(以后簡(jiǎn)稱永久對(duì)象)和臨時(shí)包裝類對(duì)象(以后簡(jiǎn)稱臨時(shí)對(duì)象)。臨時(shí)對(duì)象的意義僅僅只有包裝對(duì)HWND的操作以加速代碼編寫,不具有派生窗口類的功能。永久對(duì)象則具有前面說(shuō)的包裝類的兩個(gè)意義。
??在創(chuàng)建窗口時(shí)(即CWnd::CreateEx中),MFC通過(guò)鉤子提前(WM_CREATE和WM_NCCREATE之前)處理了通知,用AfxWndProc子類化了創(chuàng)建的窗口并將對(duì)應(yīng)的CWnd*加入當(dāng)前線程的永久對(duì)象的映射中,而在AfxWndProc中,總是由CWnd::FromHandlePermanent(獲得對(duì)應(yīng)HWND的永久對(duì)象)得到當(dāng)前線程中當(dāng)前消息所屬窗口句柄對(duì)應(yīng)的永久對(duì)象,然后通過(guò)調(diào)用得到的CWnd*的WindowProc成員函數(shù)來(lái)處理消息以實(shí)現(xiàn)派生窗口類的效果。這也就是說(shuō)永久對(duì)象具有窗口子類化的意義,而不僅僅是封裝HWND的操作。
??要將一個(gè)HWND和一個(gè)已有的包裝類對(duì)象相關(guān)聯(lián),調(diào)用CWnd::Attach將此包裝類對(duì)象和HWND映射成永久對(duì)象(但這種方法得到的永久對(duì)象不一定具有子類化功能,很可能仍和臨時(shí)對(duì)象一樣,僅僅起封裝的目的)。如果想得到臨時(shí)對(duì)象,則通過(guò)CWnd::FromHandle這個(gè)靜態(tài)成員函數(shù)以獲得。臨時(shí)對(duì)象之所以叫臨時(shí),就是其是由MFC內(nèi)部(CHandleMap::FromHandle)生成,其內(nèi)部(CHandleMap::DeleteTemp)銷毀(一般通過(guò)CWinThread::OnIdle中調(diào)用AfxUnlockTempMaps)。因此程序員是永遠(yuǎn)不應(yīng)該試圖銷毀臨時(shí)對(duì)象的(即使臨時(shí)對(duì)象所屬線程沒有消息循環(huán),不能調(diào)用CwinThread::OnIdle,在線程結(jié)束時(shí),CHandleMap的析構(gòu)仍然會(huì)銷毀臨時(shí)對(duì)象)。

原因
??為什么要分兩種包裝類對(duì)象?很好玩嗎?注意前面提過(guò)的窗口模型——只能通過(guò)消息機(jī)制和窗口交互。注意,也就是說(shuō)窗口是線程安全的實(shí)例。窗口過(guò)程的編寫中不用考慮會(huì)有多個(gè)線程同時(shí)訪問(wèn)窗口的狀態(tài)。如果不使用兩種包裝類對(duì)象,在窗口創(chuàng)建的鉤子中通過(guò)調(diào)用SetProp將創(chuàng)建的窗口句柄和對(duì)應(yīng)的CWnd*綁定,不一樣也可以實(shí)現(xiàn)前面說(shuō)的窗口句柄和內(nèi)存塊的綁定?
??CWnd的派生類CA,具有一個(gè)成員變量m_BGColor以決定使用什么顏色填充底背景。線程1創(chuàng)建了CA的一個(gè)實(shí)例a,將其指針傳進(jìn)線程2,線程2設(shè)置a.m_BGColor為紅色。這已經(jīng)很明顯了,CA::m_BGColor不是線程安全的,如果不止一個(gè)線程2,那么a.m_BGColor將會(huì)出現(xiàn)線程訪問(wèn)沖突。這嚴(yán)重違背窗口是線程安全的這個(gè)要求。因?yàn)槭褂昧朔窍C(jī)制與窗口進(jìn)行交互,所以失敗。
??繼續(xù),如果給CA一個(gè)公共成員函數(shù)SetBGColor,并在其中使用原子操作以保護(hù)m_BGColor,不就一切正常了?呵,在CA::OnPaint中,會(huì)兩次使用m_BGColor進(jìn)行繪圖,如果在兩次繪圖之間另一線程調(diào)用CA::SetBGColor改變了CA::m_BGColor,問(wèn)題嚴(yán)重了。也就是說(shuō)不光是CA::m_BGColor的寫操作需要保護(hù),讀操作亦需要保護(hù),而這僅僅是一個(gè)成員變量。
??那么再繼續(xù),完全按照窗口本身的定義,只使用消息與它交互,也就是說(shuō)自定義一個(gè)消息,如AM_SETBGCOLOR,然后在CA::SetBGColor中SendMessage這個(gè)消息,并在其響應(yīng)函數(shù)中修改CA::m_BGColor。完美了,這是即符合窗口概念又很好的設(shè)計(jì),不過(guò)它要求每一個(gè)程序員編寫每一個(gè)包裝類時(shí)都必須注意到這點(diǎn),并且最重要的是,C++類的概念在這個(gè)設(shè)計(jì)中根本沒有發(fā)揮作用,嚴(yán)重地資源浪費(fèi)。
??因此,MFC決定要發(fā)揮C++類的概念的優(yōu)勢(shì),讓包裝類對(duì)象看起來(lái)就等同于窗口本身,因此使用了上面的兩種包裝類對(duì)象。讓包裝類對(duì)象隨線程的不同而不同可以對(duì)包裝類對(duì)象進(jìn)行線程保護(hù),也就是說(shuō)一個(gè)線程不可以也不應(yīng)該訪問(wèn)另一個(gè)線程中的包裝類對(duì)象(因?yàn)榘b類對(duì)象就相當(dāng)于窗口,這是MFC的目標(biāo),并不是包裝類本身不能被跨線程訪問(wèn)),“不可以”就是通過(guò)在包裝類成員函數(shù)中的斷言宏實(shí)現(xiàn)的(在CWnd::AssertValid中),而“不應(yīng)該”前面已經(jīng)解釋地很清楚了。因此本文開頭的斷言失敗的根本原因就是因?yàn)檫`反了“不可以”和“不應(yīng)該”。
??雖然包裝類對(duì)象不能跨線程訪問(wèn),但是窗口句柄卻可以跨線程訪問(wèn)。因?yàn)榘b類對(duì)象不僅等同于窗口,還改變了窗口的交互方式(這也正是C++類的概念的應(yīng)用),使得不用非得使用消息機(jī)制才能和窗口交互。注意前面提到的,如果跨線程訪問(wèn)包裝類對(duì)象,而又使用C++類的概念操作它,則其必須進(jìn)行線程保護(hù),而“不能跨線程訪問(wèn)”就消除了這個(gè)問(wèn)題。因此臨時(shí)對(duì)象的產(chǎn)生就只是如前面所說(shuō),方便代碼的編寫而已,不提供子類化的效果,因?yàn)榇翱诰浔梢钥缇€程訪問(wèn)。

解決辦法

??已經(jīng)了解失敗的原因,因此做如下修改:

DWORD WINAPI ThreadProc( void *pData ) // 線程函數(shù)(比如用于從COM口獲取數(shù)據(jù)) {// 數(shù)據(jù)獲取循環(huán)// 數(shù)據(jù)獲得后放在變量i中CAbcDialog *pDialog = static_cast< CAbcDialog* >(CWnd::FromHandle( reinterpret_cast< HWND >( pData ) ) );ASSERT_VALID( pDialog ); // 此處可能斷言失敗pDialog->m_Data = i; // 這是不好的設(shè)計(jì),詳情可參看我的另一篇文章:《語(yǔ)義的需要》pDialog->UpdateData( FALSE ); // UpdateData內(nèi)部ASSERT_VALID( this )可能斷言失敗… } BOOL CAbcDialog::OnInitDialog() {CDialog::OnInitDialog();// 其他初始化代碼CreateThread( NULL, 0, ThreadProc, m_hWnd, 0, NULL ); // 創(chuàng)建線程return TRUE; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

??之所以是“可能”,因?yàn)檫@里有個(gè)重點(diǎn)就是臨時(shí)對(duì)象是HWND操作的封裝,不是窗口類的封裝。因此所有的HWND臨時(shí)對(duì)象都是CWnd的實(shí)例,即使上面強(qiáng)行轉(zhuǎn)換為CAbcDialog*也依舊是CWnd*,所以在ASSERT_VALID里調(diào)用CAbcDialog::AssertValid時(shí),其定義了一些附加檢查,則可能發(fā)現(xiàn)這是一個(gè)CWnd的實(shí)例而非一個(gè)CAbcDialog實(shí)例,導(dǎo)致斷言失敗。因此應(yīng)將CAbcDialog全部換成CWnd,這下雖然不斷言失敗了,但依舊錯(cuò)誤(先不提pDialog->m_Data怎么辦),因?yàn)榕R時(shí)對(duì)象是HWND操作的封裝,而不幸的是UpdateData只是MFC自己提供的一個(gè)對(duì)話框數(shù)據(jù)交換的機(jī)制(DDX)的操作,其不是通過(guò)向HWND發(fā)送消息來(lái)實(shí)現(xiàn)的,而是通過(guò)虛函數(shù)機(jī)制。因此在UpdateData中調(diào)用實(shí)例的DoDataExchange將不能調(diào)用CAbcDialog::DoDataExchange,而是調(diào)用CWnd::DoDataExchange,因此將不發(fā)生任何事。
??因此合理(并不一定最好)的解決方法是向CAbcDialog的實(shí)例發(fā)送一個(gè)消息,而通過(guò)一個(gè)中間變量(如一全局變量)來(lái)傳遞數(shù)據(jù),而不是使用CAbcDialog::m_Data。當(dāng)然,如果數(shù)據(jù)少,比如本例,就應(yīng)該將數(shù)據(jù)作為消息參數(shù)進(jìn)行傳遞,減少代碼的復(fù)雜性;數(shù)據(jù)多則應(yīng)該通過(guò)全局變量傳遞,減少了緩沖的管理費(fèi)用。修改后如下:

#define AM_DATANOTIFY ( WM_USER + 1 ) static DWORD g_Data = 0; DWORD WINAPI ThreadProc( void *pData ) // 線程函數(shù)(比如用于從COM口獲取數(shù)據(jù)) {// 數(shù)據(jù)獲取循環(huán)// 數(shù)據(jù)獲得后放在變量i中g(shù)_Data = i;CWnd *pWnd = CWnd::FromHandle( reinterpret_cast< HWND >( pData ) );ASSERT_VALID( pWnd ); // 本例應(yīng)該直接調(diào)用平臺(tái)SendMessage而不調(diào)用包裝類的,這里只是演示pWnd->SendMessage( AM_DATANOTIFY, 0, 0 );… } BEGIN_MESSAGE_MAP( CAbcDialog, CDialog )…ON_MESSAGE( AM_DATANOTIFY, OnDataNotify )… END_MESSAGE_MAP() BOOL CAbcDialog::OnInitDialog() {CDialog::OnInitDialog();// 其他初始化代碼CreateThread( NULL, 0, ThreadProc, m_hWnd, 0, NULL ); // 創(chuàng)建線程return TRUE; } LRESULT CAbcDialog::OnDataNotify( WPARAM /* wParam */, LPARAM /* lParam */ ) {UpdateData( FALSE );return 0; } void CAbcDialog::DoDataExchange( CDataExchange *pDX ) {CDialog::DoDataExchange( pDX );DDX_Text( pDX, IDC_EDIT1, g_Data ); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

注意事項(xiàng)

??“線程安全”是一個(gè)什么概念?
??以前常聽高手告誡MFC對(duì)象不要跨線程使用,因?yàn)镸FC不是線程安全的。比如CWnd對(duì)象不要跨線程使用,可以用窗口句柄(HWND)代替。CSocket/CAsyncSocket對(duì)象不要跨線程使用,用SOCKET句柄代替.那么到底什么是線程安全呢?什么時(shí)候需要考慮?如果程序涉及到多線程的話,就應(yīng)該考慮線程安全問(wèn)題。比如說(shuō)設(shè)計(jì)的接口,將來(lái)需要在多線程環(huán)境中使用,或者需要跨線程使用某個(gè)對(duì)象時(shí),這個(gè)就必須考慮了。關(guān)于線程安全也沒什么權(quán)威定義。在這里我只說(shuō)說(shuō)我的理解:所提供的接口對(duì)于線程來(lái)說(shuō)是原子操作或者多個(gè)線程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說(shuō)我們不用考慮同步的問(wèn)題。
??一般而言“線程安全”由多線程對(duì)共享資源的訪問(wèn)引起。如果調(diào)用某個(gè)接口時(shí)需要我們自己采取同步措施來(lái)保護(hù)該接口訪問(wèn)的共享資源,則這樣的接口不是線程安全的.MFC和STL都不是線程安全的. 怎樣才能設(shè)計(jì)出線程安全的類或者接口呢?如果接口中訪問(wèn)的數(shù)據(jù)都屬于私有數(shù)據(jù),那么這樣的接口是線程安全的.或者幾個(gè)接口對(duì)共享數(shù)據(jù)都是只讀操作,那么這樣的接口也是線程安全的.如果多個(gè)接口之間有共享數(shù)據(jù),而且有讀有寫的話,如果設(shè)計(jì)者自己采取了同步措施,調(diào)用者不需要考慮數(shù)據(jù)同步問(wèn)題,則這樣的接口是線程安全的,否則不是線程安全的。

多線程的程序設(shè)計(jì)應(yīng)該注意些什么呢
??盡量少的使用全局變量、static變量做共享數(shù)據(jù),盡量使用參數(shù)傳遞對(duì)象。被參數(shù)傳遞的對(duì)象,應(yīng)該只包括必需的成員變量。所謂必需的成員變量,就是必定會(huì)被多線程操作的。很多人圖省事,會(huì)把this指針(可能是任意一個(gè)對(duì)象指針)當(dāng)作線程參數(shù)傳遞,致使線程內(nèi)部有過(guò)多的操作權(quán)限,對(duì)this中的參數(shù)任意妄為。整個(gè)程序由一個(gè)人完成,可能會(huì)非常注意,不會(huì)出錯(cuò),但只要一轉(zhuǎn)手,程序就會(huì)面目全非。當(dāng)兩個(gè)線程同時(shí)操作一個(gè)成員變量的時(shí)候,程序就開始崩潰了,更糟的是,這種錯(cuò)誤很難被重現(xiàn)。(我就在郁悶這個(gè)問(wèn)題,我們是幾個(gè)人,把程序編成debug版,經(jīng)過(guò)數(shù)天使用,才找到錯(cuò)誤。而找到錯(cuò)誤只是開始,因?yàn)槟阋C明這個(gè)bug被修改成功了,也非常困難。)其實(shí),線程間數(shù)據(jù)交互大多是單向的,在線程回調(diào)函數(shù)入口處,盡可能的將傳入的數(shù)據(jù)備份到局部變量中(當(dāng)然,用于線程間通訊的變量不能這么處理),以后只對(duì)局部變量做處理,可以很好的解決這種問(wèn)題。
??在MFC中請(qǐng)慎用線程。因?yàn)镸FC的框架假定你的消息處理都是在主線程中完成的。首先窗口句柄是屬于線程的,如果擁有窗口句柄的線程退出了,如果另一個(gè)線程處理這個(gè)窗口句柄,系統(tǒng)就會(huì)出現(xiàn)問(wèn)題。而MFC為了避免這種情況的發(fā)生,使你在子線程中調(diào)用消息(窗口)處理函數(shù)時(shí),就會(huì)不停的出Assert錯(cuò)誤,煩都煩死你。典型的例子就時(shí)CSocket,因?yàn)镃Socket是使用了一個(gè)隱藏窗口實(shí)現(xiàn)了假阻塞,所以不可避免的使用了消息處理函數(shù),如果你在子線程中使用CSocket,你就可能看到assert的彈出了。
??不要在不同的線程中同時(shí)注冊(cè)COM組件。兩個(gè)線程,一個(gè)注冊(cè)1.ocx, 2.ocx, 3.ocx, 4.ocx; 而另一個(gè)則注冊(cè)5.ocx, 6.ocx, 7.ocx, 8.ocx,結(jié)果死鎖發(fā)生了,分別死在FreeLibrary和DllRegisterServer,因?yàn)檫@8個(gè)ocx是用MFC中做的,也可能是MFC的Bug,但DllRegisterServer卻死在GetModuleFileName里,而GetModuleFileName則是個(gè)API唉!如果有過(guò)客看到,恰巧又知道其原因,請(qǐng)不吝賜教。
??不要把線程搞的那么復(fù)雜。很多初學(xué)者,恨不能用上線程相關(guān)的所有的函數(shù),這里互斥,那里等待,一會(huì)兒起線程,一會(huì)兒關(guān)線程的,比起goto語(yǔ)句有過(guò)之而無(wú)不及。好的多線程程序,應(yīng)該是盡量少的使用線程。這句話怎么理解吶,就是說(shuō)盡量統(tǒng)一一塊數(shù)據(jù)共享區(qū)存放數(shù)據(jù)隊(duì)列,工作子線程從隊(duì)列中取數(shù)據(jù),處理,再放回?cái)?shù)據(jù),這樣才會(huì)模塊化,對(duì)象化;而不是每個(gè)數(shù)據(jù)都起一個(gè)工作子線程處理,處理完了就關(guān)閉,寫的時(shí)候雖然直接,等維護(hù)起來(lái)就累了。

后記:
在弄 gh0st 的status bar 的時(shí)候遇到了一個(gè)錯(cuò)誤,正好看到了這篇文章。感覺分析很好 ,就轉(zhuǎn)載了。

總結(jié)

以上是生活随笔為你收集整理的MFC不能多线程操作控件的原因的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

中文字幕精品三级久久久 | 免费网站污 | 免费看黄色大全 | 一二三区av | 色丁香婷婷 | 日韩电影一区二区三区 | 国产丝袜在线 | 狠狠干网 | 色婷婷狠狠 | 精品视频一区在线 | 香蕉视频久久 | 麻豆国产精品va在线观看不卡 | 人人插人人艹 | 在线观看国产日韩 | 在线观看你懂的网站 | 久久婷五月 | www.av在线.com| 热99在线| 色婷婷丁香 | 91久久人澡人人添人人爽欧美 | av蜜桃在线 | 国产在线一区二区 | 四虎成人免费影院 | 国产一在线精品一区在线观看 | av手机在线播放 | 国产免费av一区二区三区 | 夜夜天天干 | 久久一区精品 | 亚洲 欧美 综合 在线 精品 | 日本三级人妇 | 免费av在线网 | 91在线精品播放 | 狠狠网| 色婷婷精品大在线视频 | 色婷婷欧美 | 国产精品久久久久久久免费观看 | 亚洲精品免费在线视频 | 国产一线在线 | 伊人av综合 | 在线日韩av | 91丨九色丨91啦蝌蚪老版 | 九九久久精品 | 一区二区三区中文字幕在线观看 | 久久久久久久久久影视 | 91亚洲精品国偷拍 | 国产一区福利 | 国产 日韩 中文字幕 | 成人免费在线观看入口 | 伊人五月天av| 国产在线国偷精品产拍 | 中文字幕 在线看 | 午夜视频在线观看一区 | 日韩精品中文字幕在线不卡尤物 | 亚洲欧美日韩一区二区三区在线观看 | 日韩影视在线观看 | 日韩精品欧美专区 | 国产不卡在线观看 | 国内揄拍国产精品 | 九九九九九国产 | 一区二区三区精品在线视频 | 日韩免费视频观看 | 亚洲精品国产精品久久99热 | 久久99精品久久久久久三级 | 亚洲涩涩网 | 在线日韩亚洲 | 国产片免费在线观看视频 | 免费又黄又爽视频 | 亚洲成av人片一区二区梦乃 | 久久99国产精品免费网站 | 亚洲成年人免费网站 | 日韩成人不卡 | 国产精品11 | 成人影音av | 国产成人在线一区 | 精品国自产在线观看 | 精品久久一二三区 | 国产精品观看 | 丁香一区二区 | 国产大尺度视频 | 国产高清综合 | 91九色自拍| 亚洲国产成人久久 | 日韩理论电影在线 | 麻豆视频观看 | 婷婷综合久久 | 中文字幕视频在线播放 | 亚洲激情视频在线观看 | 操操碰 | 亚洲视频 视频在线 | 久久久官网| 日韩一区二区免费视频 | 欧美激情综合色 | 就要干b| 国产一级性生活 | 999国产精品视频 | 麻豆国产精品一区二区三区 | 丁香免费视频 | www五月婷婷 | 久久婷婷国产色一区二区三区 | 国产美女被啪进深处喷白浆视频 | 久久久久久久久久久久久久免费看 | 免费观看高清 | 久久任你操 | 97伊人网 | 国产专区精品 | 国产无套精品久久久久久 | 黄色一及电影 | 97人人添人澡人人爽超碰动图 | 九九九视频精品 | 久久国产精品99久久人人澡 | 欧美色综合天天久久综合精品 | 美女久久视频 | 日韩免费成人av | 在线观看91精品视频 | 成人午夜影院在线观看 | 亚洲国产精品人久久电影 | 国产免费人人看 | 成人久久综合 | 日日噜噜噜噜夜夜爽亚洲精品 | 欧美韩国日本在线 | 91精品999| 婷婷国产精品 | 久久久人人人 | 成人夜晚看av | 人人草人 | 免费成人结看片 | 久久艹久久 | 久久免费国产精品1 | 激情综合站 | 国产精品乱码久久久久久1区2区 | 欧美日一级片 | 国产中文字幕91 | 婷婷色 亚洲 | 香蕉视频18 | 91av资源在线 | 成人午夜电影在线播放 | 99re亚洲国产精品 | 免费看一级特黄a大片 | 亚洲综合在线一区二区三区 | 欧美日本高清视频 | 狠狠干夜夜操天天爽 | 婷婷综合亚洲 | 综合天天色 | 亚洲精品中文字幕视频 | 91av视频在线观看免费 | 我要色综合天天 | 成人av片在线观看 | 人人狠狠综合久久亚洲 | 久久久久久蜜桃一区二区 | 久久艹久久| 激情网站免费观看 | 国产黄色免费 | 日韩欧美视频 | 综合在线亚洲 | 最近的中文字幕大全免费版 | 久久久久久久国产精品视频 | 在线观看播放av | 欧美性黄网官网 | 永久免费的啪啪网站免费观看浪潮 | 激情av网址 | 免费观看国产精品视频 | 国产1区在线观看 | 在线观看免费色 | 九色免费视频 | 亚洲女欲精品久久久久久久18 | 亚洲国产欧美在线看片xxoo | 右手影院亚洲欧美 | 日韩一区二区三区在线观看 | 国产精品中文字幕av | 亚洲精品在线视频 | 天海冀一区二区三区 | 亚洲国产经典视频 | 亚洲日韩精品欧美一区二区 | 欧美精品一区二区蜜臀亚洲 | 国产精品女同一区二区三区久久夜 | 久久精选视频 | 久草免费在线观看视频 | 综合黄色网 | 最新国产中文字幕 | 91免费观看国产 | 国产精品久久久久久久午夜片 | 欧美专区日韩专区 | 国内精品久久久久久久久久清纯 | 成人h在线观看 | 国产人成看黄久久久久久久久 | 国产免费观看高清完整版 | 91网在线 | 免费一级特黄毛大片 | 欧美日韩高清一区二区三区 | 91在线视频观看免费 | 国产视频中文字幕 | 91精品欧美| 免费观看一级视频 | 91热视频在线观看 | 国产中文在线播放 | 色综合天天综合 | 91亚洲精品国偷拍自产在线观看 | 国内成人av | 婷婷激情在线观看 | 成人av免费在线播放 | 最新av中文字幕 | 亚洲国内精品在线 | 中文字幕在线观看免费 | 激情在线网址 | 中文字幕免费久久 | 久久国语 | 精品国产人成亚洲区 | 99免费国产| 黄色小说18| 手机在线免费av | 久久99久久99精品免费看小说 | 亚洲一区二区高潮无套美女 | 粉嫩av一区二区三区四区在线观看 | 精品人人爽 | 日韩性xxx| 久草在线免费资源站 | 久久免费视频2 | 欧美精品乱码99久久影院 | 日韩中文久久 | 日韩av电影免费在线观看 | 综合伊人久久 | 国产一区二区三区四区在线 | 日韩av成人 | 亚洲国产人午在线一二区 | 欧美爽爽爽 | 日韩有色 | 热久久视久久精品18亚洲精品 | 国产精品久久久999 国产91九色视频 | 色婷婷视频在线 | 天天做综合网 | 国产va精品免费观看 | 久艹视频免费观看 | 天天操操操操操 | 亚洲激情中文 | 激情六月婷婷久久 | 精品亚洲午夜久久久久91 | 最近中文字幕在线播放 | 国产原创中文在线 | 最新av网址大全 | 91成人区| 8x成人在线 | 中文字幕在线人 | 久久精品免费播放 | 久久久九九 | 国产一级黄色av | 一区二区三区日韩在线 | 国产成年人av| 亚洲黄色一级大片 | 成人h电影 | 欧美一级片在线 | 日韩免费一区 | 91香蕉视频黄 | 国产精品国产亚洲精品看不卡 | 超碰在线中文字幕 | 色视频在线观看 | 亚洲激情综合 | 天天色中文 | 日韩精品中文字幕在线观看 | 久久久福利视频 | 国产亚洲小视频 | 公与妇乱理三级xxx 在线观看视频在线观看 | 制服丝袜在线 | 亚洲精品动漫久久久久 | 成人午夜电影免费在线观看 | 国产一级片播放 | 国产系列在线观看 | 91香蕉视频黄色 | 亚洲精品动漫久久久久 | 日本在线观看一区二区三区 | 成人一区不卡 | 五月天激情电影 | 欧美在线观看视频一区二区三区 | 日日日操操 | 日本在线观看视频一区 | 在线观看va| 天堂av在线网站 | 免费观看xxxx9999片 | 国产91勾搭技师精品 | 成人久久| 日韩视频中文字幕在线观看 | 婷婷色影院 | av中文天堂| 一级一级一片免费 | 色综合天天干 | 日韩精品综合在线 | 一区二区三区在线不卡 | 亚洲精品久久视频 | avav片| 91在线免费公开视频 | 顶级欧美色妇4khd | 99久久久国产精品 | 在线国产欧美 | 日韩a级免费视频 | 中文字幕在线高清 | 久久久亚洲精华液 | 一本一本久久a久久精品综合妖精 | 免费成人av电影 | av网站在线免费观看 | 精品国产三级 | 成人免费影院 | 国产精品一区二区吃奶在线观看 | 天天操婷婷 | 欧美激情精品久久久久久变态 | 国产一级在线 | 免费福利视频网 | 欧美日韩国产精品一区二区三区 | 丝袜少妇在线 | 丁香五香天综合情 | 偷拍精偷拍精品欧洲亚洲网站 | 99久久久免费视频 | 超碰官网 | 西西444www高清大胆 | 一级电影免费在线观看 | 在线不卡的av | 狠狠色丁香婷婷综合基地 | 99久久精品免费视频 | 综合激情久久 | 成人在线视频免费看 | 国产精品成人免费精品自在线观看 | 精品成人久久 | 亚洲午夜剧场 | 亚洲精品乱码白浆高清久久久久久 | 国内免费的中文字幕 | 五月天婷婷在线观看视频 | 91网在线看 | 久久精品国产一区 | 亚洲黄色一级大片 | 亚洲a在线观看 | 日韩精品一区二区三区电影 | 超碰资源在线 | 天天干天天干天天 | 中文久草 | 日韩av成人在线 | 一区 二区电影免费在线观看 | 中文字幕一区二区三区久久蜜桃 | 精品99免费 | 天天爽综合网 | 色婷婷av一区 | av在线播放快速免费阴 | 久久免费av | 九九精品视频在线看 | 精品一二三四在线 | 青青河边草免费直播 | 国产免费黄色 | 国产一区二区在线播放 | 亚洲精品在线一区二区三区 | 久久国产视频网 | 亚洲高清在线观看视频 | 91最新中文字幕 | 久久久www成人免费精品 | 国产群p视频 | 91精品999| 国产日韩精品一区二区在线观看播放 | 亚洲成人动漫在线观看 | 在线观看播放av | 国产精品 美女 | 久久久伊人网 | 91一区二区三区久久久久国产乱 | wwwwww国产 | 欧美视频国产视频 | 久久99精品国产麻豆婷婷 | 欧美福利精品 | 亚洲一区二区精品视频 | 国产成人精品久久久久 | 久久精品免费电影 | 久久人视频 | 亚洲网站在线看 | 天天干天天干天天干天天干天天干天天干 | 日韩免费福利 | 久久综合中文字幕 | 欧美一二三区播放 | 色免费在线 | 日韩在线一级 | 久久成人精品视频 | 国产精品理论视频 | 亚洲成av人影片在线观看 | 国产五月天婷婷 | 狠狠操在线 | 色成人亚洲 | 新版资源中文在线观看 | 亚洲精品黄色在线观看 | 中文字幕av在线 | 在线观看精品一区 | 激情五月激情综合网 | 在线视频日韩欧美 | 欧美精品在线一区二区 | 国产精品va在线观看入 | 国产精品99久久免费黑人 | 一区二区电影在线观看 | 国产手机视频精品 | 99久久er热在这里只有精品66 | www·22com天天操 | 久久精品视频网址 | 久插视频| 中文字幕一区二区三区四区视频 | 日韩毛片在线播放 | 日本黄色免费看 | 日韩av手机在线看 | 亚洲国产精品第一区二区 | 亚洲午夜精品久久久久久久久 | 国产尤物在线 | 一区二区 不卡 | 国产日韩精品一区二区三区在线 | 色婷婷丁香 | 亚洲国产精品第一区二区 | 91精品1区 | 欧美性久久久久久 | 91香蕉视频黄 | 九九99| 欧美国产大片 | 日韩在线第一 | 国产精品99久久久久久人免费 | 日日夜夜狠狠操 | 久草视频精品 | 国产69精品久久久久久久久久 | 国产又黄又硬又爽 | 欧美一区免费在线观看 | 人人干人人上 | 99精品热视频只有精品10 | 欧美精品做受xxx性少妇 | 免费毛片一区二区三区久久久 | 亚洲男男gⅴgay双龙 | 成人小电影在线看 | 性色va | 99在线观看视频网站 | 九九日九九操 | 亚洲国产综合在线 | 日韩精品一区不卡 | 超碰在线人人艹 | 精品一区二区在线观看 | 国产视频中文字幕 | 草久草久 | 人人澡人| 500部大龄熟乱视频使用方法 | 亚洲在线高清 | 色婷婷一区 | 四虎在线观看视频 | 欧美一级电影在线观看 | 亚洲全部视频 | 国产91免费在线 | 久一在线 | 黄色tv视频 | 国产高清成人在线 | 在线成人一区二区 | 精品国产乱码久久久久久浪潮 | 免费久久精品视频 | 91九色视频导航 | 成人黄色av网站 | 99综合电影在线视频 | 精品视频在线观看 | 国产视频精品在线 | av超碰在线观看 | 欧美精品v国产精品v日韩精品 | 一区二区精品视频 | 国产精品一区二区免费视频 | 91一区啪爱嗯打偷拍欧美 | 伊人色综合久久天天 | 久黄色| 免费h视频 | 久久超级碰 | 天天综合久久综合 | 久久草草热国产精品直播 | 日韩精品一区在线观看 | 免费精品在线观看 | 国产一级二级在线播放 | 久久精品免费看 | 超碰av在线 | 天天操天天综合网 | 国产精品久久 | 综合av在线 | 欧美污污网站 | 国际精品久久久 | 在线91观看| 国产精品久久久久久久免费大片 | 韩日在线一区 | 99久久精品免费看国产一区二区三区 | 视频在线在亚洲 | 伊人久久在线观看 | 99久久精品久久亚洲精品 | 九九综合九九 | 国内免费久久久久久久久久久 | 99精品免费久久久久久久久日本 | 四虎永久免费在线观看 | 久草精品视频在线播放 | 亚洲精品乱码久久 | av福利网址导航 | 国产成人福利在线 | 欧美日韩中文另类 | 免费看的黄色网 | 不卡中文字幕在线 | 欧美一级日韩三级 | 久久99在线观看 | 精品91久久久久 | 开心色婷婷 | 成人在线网站观看 | av福利在线免费观看 | 手机看片午夜 | 欧美成人精品三级在线观看播放 | av黄色一级片 | 久久艹人人 | 日韩毛片精品 | 国产成人在线观看免费 | 日韩精品中文字幕一区二区 | 色综合久久综合中文综合网 | 久久精品导航 | 国产精品久久久久久久久久ktv | 在线视频日韩 | 欧美日韩免费观看一区=区三区 | 深爱激情开心 | 久久国产精品99国产 | 一级性av| 97视频在线观看播放 | 狠狠综合| 久久99久久99精品免观看软件 | 久久亚洲人 | 国产传媒一区在线 | 欧美日韩中文国产 | 免费观看性生交大片3 | 麻豆网站免费观看 | 香蕉久草 | 欧洲色吧 | 久久午夜网 | 欧美日韩免费视频 | 亚洲欧美成人网 | 中文字幕中文字幕在线一区 | 久久综合色一综合色88 | 91人人射 | 最近久乱中文字幕 | 综合av在线 | 国产一区免费看 | 日韩欧美综合 | 91亚洲狠狠婷婷综合久久久 | 欧美日韩国产网站 | 久久精国产 | 国产视频精品久久 | 久草亚洲视频 | 国产精品一区二区在线观看 | www.天天色| 三级小视频在线观看 | 色多多污污| 999国内精品永久免费视频 | 亚洲狠狠丁香婷婷综合久久久 | 久草资源在线观看 | 麻豆国产视频 | 中文字幕亚洲欧美 | 九九精品毛片 | 去看片 | 欧美午夜视频在线 | 亚洲国产天堂av | 国产高清免费在线播放 | 天天色棕合合合合合合 | 91精品第一页 | 久久精品亚洲一区二区三区观看模式 | 欧美日韩久久不卡 | 国产小视频在线看 | av播放在线 | 久草在线资源观看 | 色噜噜日韩精品欧美一区二区 | 欧美综合久久久 | 欧美日韩国产在线观看 | 日韩视频免费 | av东方在线 | 国产香蕉视频在线观看 | 国产一区二区久久精品 | 九九免费在线视频 | 亚在线播放中文视频 | 这里只有精彩视频 | 91超碰在线播放 | 成人在线播放免费观看 | 丰满少妇久久久 | 在线国产激情视频 | 国产不卡在线视频 | 欧美日韩高清在线 | zzijzzij亚洲日本少妇熟睡 | 精品国产乱码久久久久久1区2匹 | 欧美日韩在线免费视频 | 亚洲精品国产精品国自 | 欧美日韩国产一区二区三区在线观看 | 欧美久久久久久久久久久久久 | 精品免费在线视频 | 成人小视频在线免费观看 | 中文字幕在线视频精品 | 波多野结衣在线播放一区 | 五月婷婷激情综合网 | 美女亚洲精品 | 亚洲色图av | 日韩高清在线一区二区三区 | 永久精品视频 | 欧美福利久久 | 欧美日一级片 | 色资源网免费观看视频 | 午夜精品一区二区三区视频免费看 | 国产精品成人国产乱 | 免费大片av| 亚洲黄色在线播放 | 超碰人人在线 | 五月婷婷激情 | www蜜桃视频 | 91免费的视频在线播放 | 天天天操天天天干 | 欧美日韩一级久久久久久免费看 | 国产精品高 | 青青草视频精品 | 在线激情av电影 | 欧美亚洲一级片 | 在线国产高清 | 最近免费中文字幕大全高清10 | 久久综合激情 | 激情文学丁香 | 天天天天综合 | 国产xx视频 | 国产精品视频永久免费播放 | 在线黄色免费 | 97视频在线 | 天天操天天干天天操天天干 | 日韩久久精品一区二区 | 色综合天 | 久视频在线 | 久久这里精品视频 | 亚洲日韩欧美一区二区在线 | 日韩欧美69 | 国产精品视频免费看 | 精品中文字幕在线播放 | 18做爰免费视频网站 | 亚洲精品电影在线 | 成人a免费 | 黄av资源 | 人人爽久久久噜噜噜电影 | 最近中文字幕国语免费av | 欧美一级黄色网 | 狠狠艹夜夜干 | 亚洲精品免费在线视频 | 国产自产高清不卡 | www.一区二区三区 | 久久免费精品一区二区三区 | 一区二区三区 中文字幕 | 日本精油按摩3 | 激情欧美一区二区三区免费看 | 亚洲va欧美va | 国产精品色婷婷视频 | 久久久久久久久久久电影 | 日韩欧美高清一区二区三区 | 精品一区精品二区高清 | 九色视频网站 | 四虎8848免费高清在线观看 | av高清网站在线观看 | 黄免费在线观看 | 黄色三级在线看 | 中文字幕观看在线 | 精品视频在线观看 | 少妇高潮流白浆在线观看 | 一区二区三区免费看 | 亚洲乱码久久 | 中文字幕在线看视频国产中文版 | 亚洲伊人第一页 | 一区二区三区播放 | 一区二精品 | 黄色三级网站在线观看 | 中文字幕日韩国产 | 日韩网站在线免费观看 | 在线精品视频免费播放 | 亚洲婷婷在线视频 | 一区二区三区在线观看免费 | 日韩视频图片 | 国产精品久久亚洲 | 激情深爱 | 成人片在线播放 | 91av原创| 成人av片免费观看app下载 | 中文字幕日本在线 | 欧美日韩精品在线观看视频 | 天天天天天干 | 国产精品久久久99 | 国产精品一区免费观看 | 黄色av网站在线观看免费 | 亚洲欧美日韩国产一区二区三区 | 久久免费视频国产 | 国产精品初高中精品久久 | 欧美亚洲国产精品久久高清浪潮 | 久久综合欧美精品亚洲一区 | 中文字幕免费久久 | 国模一区二区三区四区 | 黄色三级免费观看 | 国产只有精品 | 亚洲好视频| 夜夜骑日日操 | 中文字幕成人av | 国产免费嫩草影院 | 久久天天操 | 日韩性久久 | 91麻豆网站 | 麻豆国产在线视频 | 天天射天天射天天射 | 在线观看黄色大片 | 91视频啪| 99情趣网视频 | 在线视频成人 | www.夜夜爽 | 国产精品自产拍在线观看桃花 | 久久资源总站 | 99久久日韩精品免费热麻豆美女 | 97碰碰视频 | 狠狠色丁香婷婷综合久小说久 | 天天色中文 | 狠狠干.com | 久草视频免费播放 | 日韩色区 | avcom在线 | 国产精品精品国产婷婷这里av | 91最新国产| 91自拍视频在线 | 国产精品美女久久久久久久久久久 | 97综合视频 | 久久欧洲视频 | 国产精品一区久久久久 | 91av久久 | 久久精品亚洲一区二区三区观看模式 | 91精品视频免费看 | 在线观看色网站 | 亚洲mv大片欧洲mv大片免费 | 操综合| 黄色一级免费电影 | av免费网站观看 | 日日摸日日| 高清不卡免费视频 | 亚洲一区日韩在线 | 17婷婷久久www | 欧美91片 | 久久精品欧美一区二区三区麻豆 | 日韩三级视频 | 最近中文字幕免费视频 | 探花视频免费观看高清视频 | 四虎在线观看视频 | 久久精品日本啪啪涩涩 | 97超碰资源总站 | 国产精品原创在线 | 中文字幕 成人 | 欧美激情综合色综合啪啪五月 | avlulu久久精品 | 91人人澡人人爽 | 久久精品一区二区三区中文字幕 | 狠狠色丁香婷婷综合久久片 | 国产福利91精品一区二区三区 | 欧美日韩精品网站 | 国产成人在线综合 | 999久久国产 | 国产精品亚洲综合久久 | 成人动漫视频在线 | 中文日韩在线 | 中文字幕有码在线观看 | 久草在在线 | 免费看黄色大全 | 国产手机精品视频 | 免费成人在线观看 | 日韩欧美有码在线 | 婷婷激情在线 | 麻豆国产精品视频 | 一区二区精品在线 | 999成人| 国产91小视频 | 日韩午夜电影 | 亚洲欧美精品一区二区 | 狠狠色狠狠色综合日日92 | 在线免费看黄网站 | 久久av免费电影 | 免费a v观看| 人人插人人插 | 狂野欧美激情性xxxx | 日日操夜 | 一区二区欧美激情 | 中文字幕免费成人 | 国产精品岛国久久久久久久久红粉 | 在线视频电影 | 亚洲激精日韩激精欧美精品 | 欧美小视频在线 | 亚洲激情在线播放 | 成人一级视频在线观看 | 制服丝袜欧美 | 最近中文字幕 | 中文字幕色在线 | 国产美女精品在线 | 日韩欧美在线高清 | 区一区二在线 | 五月婷婷激情六月 | 欧美精品中文在线免费观看 | 亚洲伊人天堂 | 99久久一区| 亚洲午夜av久久乱码 | 久久精品一级片 | 亚洲在线综合 | 精品国产自在精品国产精野外直播 | 久久精品亚洲一区二区三区观看模式 | 久久欧洲视频 | 91视频首页 | 成人h在线观看 | 日韩一区二区在线免费观看 | 亚洲成a人片在线www | 91九色老| 五月天婷婷狠狠 | 国产亚洲成人网 | 国产99久久久国产精品成人免费 | 五月婷婷色综合 | 狠狠色丁香婷婷综合久小说久 | 一本之道乱码区 | 久久久久久亚洲精品 | 91精选在线观看 | 99久久er热在这里只有精品15 | 亚洲一级影院 | av大全免费在线观看 | av免费观看高清 | 国产精品毛片一区二区 | 久久精品小视频 | 一色屋精品视频在线观看 | 国产成人综 | 色操插 | 成人一级在线观看 | 久久国产精品久久久久 | 亚洲精品乱码久久久久久写真 | 国产在线污 | 久久精品99国产精品酒店日本 | 狠狠干天天射 | 97在线影院 | 国产精品视频免费 | 精品国产一区二区三区久久久久久 | 久久99亚洲精品久久久久 | 亚洲精品99久久久久久 | 天天做日日爱夜夜爽 | 九九九热精品免费视频观看 | 欧美三级在线播放 | 免费影视大全推荐 | 成人黄色免费观看 | 91久久国产综合精品女同国语 | 2020天天干夜夜爽 | 91免费看黄色 | 亚洲黄色在线 | 91香蕉视频污在线 | 97精品国产91久久久久久久 | 亚洲免费在线观看视频 | 91精品国产乱码在线观看 | 超碰.com| 久久久精品久久日韩一区综合 | 久久午夜电影院 | 日韩成人中文字幕 | 午夜三级理论 | 日本中文字幕在线看 | 在线观看亚洲精品视频 | 国产又粗又猛又色又黄网站 | 2019免费中文字幕 | 一区二区三区四区在线 | 成人久久综合 | 久久久免费av | 中文字幕免费不卡视频 | 91一区二区三区久久久久国产乱 | 国产九九九九九 | 最近中文字幕免费 | 天天综合区 | 日韩va亚洲va欧美va久久 | 久久五月天婷婷 | 在线精品在线 | 国产短视频在线播放 | 欧美日韩精品国产 | 免费成人av | 97国产小视频 | 91大神一区二区三区 | 91在线播放综合 | 久久精品专区 | 婷婷精品进入 | 久久刺激视频 | 国产精品一二三 | 亚洲视频中文 | 色亚洲激情 | 91成人天堂久久成人 | 中文字幕欧美日韩va免费视频 | 欧美在线1 | 国产视频精品久久 | 国产小视频91| 91香蕉国产 | 久精品视频在线观看 | 天堂av色婷婷一区二区三区 | 国产va精品免费观看 | 日韩欧美在线国产 | 国产精品久久久久久a | 亚洲免费成人 | 欧美精品少妇xxxxx喷水 | 久久国产视频网 | 成人国产精品免费观看 | 国产剧情在线一区 | 美女福利视频网 | 开心激情久久 | 欧美日韩精品综合 | 亚洲最大免费成人网 | 狠狠色狠狠色综合系列 | 黄色免费视频在线观看 | 精品久久久999 | 91亚洲精品久久久中文字幕 | 少妇18xxxx性xxxx片 | 国产精品久久久久毛片大屁完整版 | 91色在线观看视频 | 国产涩涩网站 | 亚洲在线观看av | 在线播放亚洲 | 国产精品一区在线播放 | 综合色婷婷 | 欧美在线视频一区二区三区 | 主播av在线 | 五月激情姐姐 | 久青草视频 | 国产91精品一区二区绿帽 | 毛片永久新网址首页 | 免费在线观看av | 日韩午夜一级片 | 日韩视频免费观看高清完整版在线 | 999一区二区三区 | 丝袜+亚洲+另类+欧美+变态 | 日日夜夜草 | 国产精品久久久电影 | 精品国产乱码久久久久 | 日韩av成人免费看 | 91精品国产欧美一区二区 | 91视频免费网址 | 射射射av | 久久精品三级 | 国产特级毛片aaaaaa毛片 | 国产午夜一区 | 精品人人人人 | 国产欧美精品xxxx另类 | 区一区二区三区中文字幕 | 伊人伊成久久人综合网小说 | 日韩在线观看三区 | 91成人精品国产刺激国语对白 | 亚洲成人精品国产 | 玖玖精品在线 | 最新国产精品拍自在线播放 | 日韩三级在线观看 | 日韩高清不卡一区二区三区 | 久久天天躁夜夜躁狠狠85麻豆 | 97国产一区二区 | 91黄色免费网站 | 色视频网页 | 成人午夜黄色影院 | 久久人人97超碰com | 日韩色在线观看 | 欧美黑人xxxx猛性大交 | av一级免费 | 国产高清视频在线播放 | 色综合久久综合中文综合网 | 国产毛片久久久 | 精产嫩模国品一二三区 | 欧美日韩二区在线 | 日韩在线网址 | 久热精品国产 | 色中色资源站 | 婷婷丁香色 | 国产精品九九九九九九 | 国产区免费 | 综合网色| 在线观看精品一区 | 蜜臀av在线一区二区三区 | 可以免费观看的av片 | 日本三级香港三级人妇99 | 亚洲专区一二三 | 二区视频在线观看 | 精品一二三四视频 | 一区二区视频在线播放 | 久久网址 | 国产精品扒开做爽爽的视频 | 欧美精品久久久久久久亚洲调教 | 欧美日本不卡视频 | 国产五月天婷婷 | 久久大视频 | 国产a高清| 99爱视频 | 精品久久久久久亚洲综合网 | 在线观看免费版高清版 | 视频一区亚洲 | 中文字幕久久亚洲 | 日韩在线网 | 一本一道波多野毛片中文在线 | 中文字幕av全部资源www中文字幕在线观看 | 麻豆果冻剧传媒在线播放 | 天天射天天色天天干 | 国产精品扒开做爽爽的视频 | 久久精品综合一区 | 九九热免费在线观看 | 久久99热这里只有精品 | 成年人视频在线免费播放 | 免费福利视频网站 | av资源在线观看 | 国产97av| 精精国产xxxx视频在线播放 | 久久久蜜桃一区二区 | 成人试看120秒 | 最近日本字幕mv免费观看在线 | 中文字幕一区二区三区四区视频 | 国产vs久久 | 97热久久免费频精品99 | 精品国产视频在线观看 | 天天干天天操天天搞 |