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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++多线程编程[转]

發布時間:2024/4/14 c/c++ 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++多线程编程[转] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

VC中多線程使用比較廣泛而且實用,在網上看到的教程.感覺寫的挺好.

一、問題的提出 編寫一個耗時的單線程程序: 新建一個基于對話框的應用程序SingleThread,在主對話框IDD_SINGLETHREAD_DIALOG添加一個按鈕,ID為IDC_SLEEP_SIX_SECOND,標題為
“延時6秒”,添加按鈕的響應函數,代碼如下:
void CSingleThreadDlg::OnSleepSixSecond() { Sleep(6000); //延時6秒 } 編譯并運行應用程序,單擊“延時6秒”按鈕,你就會發現在這6秒期間程序就象“死機”一樣,不在響應其它消息。為了更好地處理這種 耗時的操作,我們有必要學習——多線程編程。 二、多線程概述 進程和線程都是操作系統的概念。進程是應用程序的執行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成 ,進程在運行過程中創建的資源隨著進程的終止而被銷毀,所使用的系統資源在進程終止時被釋放或關閉。 線程是進程內部的一個執行單元。系統創建好進程后,實際上就啟動執行了該進程的主執行線程,主執行線程以函數地址形式,比如說 main或WinMain函數,將程序的啟動點提供給Windows系統。主執行線程終止了,進程也就隨之終止。 每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其它線程,多個線 程并發地運行于同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統資源,所 以線程間的通訊非常方便,多線程技術的應用也較為廣泛。 多線程可以實現并行處理,避免了某項任務長時間占用CPU時間。要說明的一點是,目前大多數的計算機都是單處理器(CPU)的,為了運 行所有這些線程,操作系統為每個獨立線程安排一些CPU時間,操作系統以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在 同時運行。由此可見,如果兩個非常活躍的線程為了搶奪對CPU的控制權,在線程切換時會消耗很多的CPU資源,反而會降低系統的性能。這一 點在多線程編程時應該注意。 Win32 SDK函數支持進行多線程的程序設計,并提供了操作系統原理中的各種同步、互斥和臨界區等操作。Visual C++ 6.0中,使用MFC類庫也實現了多線程的程序設計,使得多線程編程更加方便。 三、Win32 API對多線程編程的支持 Win32 提供了一系列的API函數來完成線程的創建、掛起、恢復、終結以及通信等工作。下面將選取其中的一些重要函數進行說明。 1、HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); 該函數在其調用進程的進程空間里創建一個新的線程,并返回已建線程的句柄,其中各參數說明如下: lpThreadAttributes:指向一個 SECURITY_ATTRIBUTES 結構的指針,該結構決定了線程的安全屬性,一般置為 NULL; dwStackSize:指定了線程的堆棧深度,一般都設置為0; lpStartAddress:表示新線程開始執行時代碼所在函數的地址,即線程的起始地址。一般情況為(LPTHREAD_START_ROUTINE)ThreadFunc,
ThreadFunc 是線程函數名; lpParameter:指定了線程執行時傳送給線程的32位參數,即線程函數的參數; dwCreationFlags:控制線程創建的附加標志,可以取兩種值。如果該參數為0,線程在被創建后就會立即開始執行;如果該參數為 CREATE_SUSPENDED,則系統產生線程后,該線程處于掛起狀態,并不馬上執行,直至函數ResumeThread被調用; lpThreadId:該參數返回所創建線程的ID; 如果創建成功則返回線程的句柄,否則返回NULL。 2、DWORD SuspendThread(HANDLE hThread); 該函數用于掛起指定的線程,如果函數執行成功,則線程的執行被終止。 3、DWORD ResumeThread(HANDLE hThread); 該函數用于結束線程的掛起狀態,執行線程。 4、VOID ExitThread(DWORD dwExitCode); 該函數用于線程終結自身的執行,主要在線程的執行函數中被調用。其中參數dwExitCode用來設置線程的退出碼。 5、BOOL? TerminateThread(HANDLE hThread,DWORD dwExitCode); 一般情況下,線程運行結束之后,線程函數正常返回,但是應用程序可以調用TerminateThread強行終止某一線程的執行。各參數含義如下 hThread:將被終結的線程的句柄; dwExitCode:用于指定線程的退出碼。 使用TerminateThread()終止某個線程的執行是不安全的,可能會引起系統不穩定;雖然該函數立即終止線程的執行,但并不釋放線程所占 用的資源。因此,一般不建議使用該函數。
6、BOOL PostThreadMessage(DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam); 該函數將一條消息放入到指定線程的消息隊列中,并且不等到消息被該線程處理時便返回。 idThread:將接收消息的線程的ID; Msg:指定用來發送的消息; wParam:同消息有關的字參數; lParam:同消息有關的長參數; 調用該函數時,如果即將接收消息的線程沒有創建消息循環,則該函數執行失敗。 四、Win32 API多線程編程例程 例程1 MultiThread1 建立一個基于對話框的工程MultiThread1,在對話框IDD_MULTITHREAD1_DIALOG中加入兩個按鈕和一個編輯框,兩個按鈕的ID分別是IDC_START ,IDC_STOP ,標題分別為“啟動”,“停止”,IDC_STOP的屬性選中Disabled;編輯框的ID為IDC_TIME ,屬性選中Read-only; 在MultiThread1Dlg.h文件中添加線程函數聲明: void ThreadFunc(); 注意, 線程函數的聲明應在類CMultiThread1Dlg的外部。在類CMultiThread1Dlg內部添加protected型變量: HANDLE hThread; DWORD ThreadID; 分別代表線程的句柄和ID。 在MultiThread1Dlg.cpp文件中 添加全局變量m_bRun : volatile BOOL m_bRun; m_bRun 代表線程是否正在運行。 你要留意到全局變量 m_bRun 是使用 volatile 修飾符的,volatile 修飾符的作用是告訴編譯器無需對該變量作任何的優化,即無需將它放到一個寄存器中,并且該值可被外部改變。對于多線程引用的全局變量 來說,volatile 是一個非常重要的修飾符。 編寫線程函數: void ThreadFunc() ?// 放在類外 { CTime time; CString strTime; m_bRun=TRUE; while(m_bRun) { time=CTime::GetCurrentTime(); strTime=time.Format("%H:%M:%S"); ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime); Sleep(1000); } } 該線程函數沒有參數,也不返回函數值。只要m_bRun為TRUE,線程一直運行。 雙擊IDC_START按鈕,完成該按鈕的消息函數: void CMultiThread1Dlg::OnStart() { hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, NULL, 0, &ThreadID); GetDlgItem(IDC_START)->EnableWindow(FALSE); GetDlgItem(IDC_STOP)->EnableWindow(TRUE); } 雙擊IDC_STOP按鈕,完成該按鈕的消息函數: void CMultiThread1Dlg::OnStop() { m_bRun=FALSE; GetDlgItem(IDC_START)->EnableWindow(TRUE); GetDlgItem(IDC_STOP)->EnableWindow(FALSE); } 編譯并運行該例程,體會使用Win32 API編寫的多線程。
例程2 MultiThread2 該線程演示了如何傳送一個一個整型的參數到一個線程中,以及如何等待一個線程完成處理。 建立一個基于對話框的工程MultiThread2,在對話框IDD_MULTITHREAD2_DIALOG中加入一個編輯框和一個按鈕,ID分別是IDC_COUNT,IDC_START ,按鈕控件的標題為“開始”; 在MultiThread2Dlg.h文件中添加線程函數聲明: void ThreadFunc(int integer); 注意,線程函數的聲明應在類CMultiThread2Dlg的外部。 在類CMultiThread2Dlg內部添加protected型變量: HANDLE hThread; DWORD ThreadID; 分別代表線程的句柄和ID。 打開ClassWizard,為編輯框IDC_COUNT添加int型變量m_nCount。在MultiThread2Dlg.cpp文件中添加:void ThreadFunc(int integer) { int i; for(i=0;i<integer;i++) { Beep(200,50); Sleep(1000); } } 雙擊IDC_START按鈕,完成該按鈕的消息函數: void CMultiThread2Dlg::OnStart() { UpdateData(TRUE); int integer=m_nCount; hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, (VOID*)integer, 0, &ThreadID); GetDlgItem(IDC_START)->EnableWindow(FALSE); WaitForSingleObject(hThread,INFINITE); GetDlgItem(IDC_START)->EnableWindow(TRUE); } 順便說一下WaitForSingleObject函數,其函數原型為:DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds); hHandle為要監視的對象(一般為同步對象,也可以是線程)的句柄; dwMilliseconds為hHandle對象所設置的超時值,單位為毫秒; 當在某一線程中調用該函數時,線程暫時掛起,系統監視hHandle所指向的對象的狀態。如果在掛起的dwMilliseconds毫秒內,線程所等待 的對象變為有信號狀態,則該函數立即返回;如果超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態,函 數照樣返回。參數dwMilliseconds有兩個具有特殊意義的值:0和INFINITE。若為0,則該函數立即返回;若為INFINITE,則線程一直被掛起, 直到hHandle所指向的對象變為有信號狀態時為止。 本例程調用該函數的作用是按下IDC_START按鈕后,一直等到線程返回,再恢復IDC_START按鈕正常狀態。編譯運行該例程并細心體會。 例程3 MultiThread3 傳送一個結構體給一個線程函數也是可能的,可以通過傳送一個指向結構體的指針參數來完成。先定義一個結構體: typedef struct { int firstArgu, long secondArgu, … }myType,*pMyType; 創建線程時CreateThread(NULL,0,threadFunc,pMyType,…); 在threadFunc函數內部,可以使用“強制轉換”: int intValue=((pMyType)lpvoid)->firstArgu; long longValue=((pMyType)lpvoid)->seconddArgu; …… 例程3 MultiThread3將演示如何傳送一個指向結構體的指針參數。 建立一個基于對話框的工程MultiThread3,在對話框IDD_MULTITHREAD3_DIALOG中加入一個編輯框IDC_MILLISECOND,一個按鈕IDC_START,標題 為“開始” ,一個進度條IDC_PROGRESS1; 打開ClassWizard,為編輯框IDC_MILLISECOND添加int型變量m_nMilliSecond,為進度條IDC_PROGRESS1添加CProgressCtrl型變量 m_ctrlProgress; 在MultiThread3Dlg.h文件中添加一個結構的定義: struct threadInfo { UINT nMilliSecond; CProgressCtrl* pctrlProgress; }; 線程函數的聲明: UINT ThreadFunc(LPVOID lpParam); 注意,二者應在類CMultiThread3Dlg的外部。 在類CMultiThread3Dlg內部添加protected型變量: HANDLE hThread; DWORD ThreadID; 分別代表線程的句柄和ID。 在MultiThread3Dlg.cpp文件中進行如下操作: 定義公共變量 threadInfo Info; 雙擊按鈕IDC_START,添加相應消息處理函數:void CMultiThread3Dlg::OnStart() { UpdateData(TRUE); Info.nMilliSecond=m_nMilliSecond; Info.pctrlProgress=&m_ctrlProgress; hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, &Info, 0, &ThreadID); } 在函數BOOL CMultiThread3Dlg::OnInitDialog()中添加語句: { // TODO: Add extra initialization here m_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; } 順便補充一點,如果你在void CMultiThread3Dlg::OnStart() 函數中添加語句,編譯運行你就會發現進度條不進行刷新,主線程也停止了反應。什么原因呢?這是因為WaitForSingleObject函數等待子線程 (ThreadFunc)結束時,導致了線程死鎖。因為WaitForSingleObject函數會將主線程掛起(任何消息都得不到處理),而子線程ThreadFunc正 在設置進度條,一直在等待主線程將刷新消息處理完畢返回才會檢測通知事件。這樣兩個線程都在互相等待,死鎖發生了,編程時應注意避免
例程4 MultiThread4 該例程測試在Windows下最多可創建線程的數目。 建立一個基于對話框的工程MultiThread4,在對話框IDD_MULTITHREAD4_DIALOG中加入一個按鈕IDC_TEST和一個編輯框IDC_COUNT,按鈕標題為 “測試” , 編輯框屬性選中Read-only; 在MultiThread4Dlg.cpp文件中進行如下操作: 添加公共變量volatile BOOL m_bRunFlag=TRUE; 該變量表示是否還能繼續創建線程。 添加線程函數: DWORD WINAPI threadFunc(LPVOID threadNum) { while(m_bRunFlag) { Sleep(3000); } return 0; } 只要 m_bRunFlag 變量為TRUE,線程一直運行。 雙擊按鈕IDC_TEST,添加其響應消息函數:void CMultiThread4Dlg::OnTest() { DWORD threadID; GetDlgItem(IDC_TEST)->EnableWindow(FALSE); long nCount=0; while(m_bRunFlag) { if(CreateThread(NULL,0,threadFunc,NULL,0,&threadID)==NULL) { m_bRunFlag=FALSE; break; } else { nCount++; } } //不斷創建線程,直到再不能創建為止 m_nCount=nCount; UpdateData(FALSE); Sleep(5000); //延時5秒,等待所有創建的線程結束 GetDlgItem(IDC_TEST)->EnableWindow(TRUE); m_bRunFlag=FALSE; ?// 線程不再運行 } 五、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() { UpdateData(TRUE); Info.nMilliSecond=m_nMilliSecond; Info.pctrlProgress=&m_ctrlProgress; pThread=AfxBeginThread(ThreadFunc, &Info); } 在函數BOOL CMultiThread3Dlg::OnInitDialog()中添加語句: { // TODO: Add extra initialization here m_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 // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CUIThread) public: virtual BOOL InitInstance(); virtual int ExitInstance(); //}}AFX_VIRTUAL // Implementation protected: virtual ~CUIThread(); // Generated message map functions //{{AFX_MSG(CUIThread) // NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG DECLARE_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 // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CUIThread) public: virtual BOOL InitInstance(); virtual int ExitInstance(); //}}AFX_VIRTUAL // Implementation protected: CUIThreadDlg m_dlg; virtual ~CUIThread(); // Generated message map functions //{{AFX_MSG(CUIThread) // NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG DECLARE_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" 好了,編譯并運行程序吧。每單擊一次“用戶界面線程”按鈕,都會彈出一個線程對話框,在任何一個線程對話框內按下鼠標左鍵,都會 彈出一個消息框。 七、 線程間通訊 一般而言,應用程序中的一個次要線程總是為主線程執行特定的任務,這樣,主線程和次要線程間必定有一個信息傳遞的渠道,也就是主線程 和次要線程間要進行通信。這種線程間的通信不但是難以避免的,而且在多線程編程中也是復雜和頻繁的,下面將進行說明。 使用全局變量進行通信 由于屬于同一個進程的各個線程共享操作系統分配該進程的資源,故解決線程間通信最簡單的一種方法是使用全局變量。對于標準類型的全局 變量,我們建議使用volatile 修飾符,它告訴編譯器無需對該變量作任何的優化,即無需將它放到一個寄存器中,并且該值可被外部改變。如果線程間所需傳遞的信息較復 雜,我們可以定義一個結構,通過傳遞指向該結構的指針進行傳遞信息。 使用自定義消息 我們可以在一個線程的執行函數中向另一個線程發送自定義的消息來達到通信的目的。一個線程向另外一個線程發送消息是通過操作系統實現 的。利用Windows操作系統的消息驅動機制,當一個線程發出一條消息時,操作系統首先接收到該消息,然后把該消息轉發給目標線程,接收消 息的線程必須已經建立了消息循環。 例程7 MultiThread7 該例程演示了如何使用自定義消息進行線程間通信。首先,主線程向CCalculateThread線程發送消息WM_CALCULATE,CCalculateThread線 程收到消息后進行計算,再向主線程發送WM_DISPLAY消息,主線程收到該消息后顯示計算結果。 建立一個基于對話框的工程MultiThread7,在對話框IDD_MULTITHREAD7_DIALOG中加入三個單選按鈕IDC_RADIO1,IDC_RADIO2,IDC_RADIO3,標 題分別為1+2+3+4+......+10,1+2+3+4+......+50,1+2+3+4+......+100。加入按鈕IDC_SUM,標題為“求和”。加入標簽框IDC_STATUS,屬性 選中“邊框”; 在MultiThread7Dlg.h中定義如下變量: protected: int nAddend; 代表加數的大小。 分別雙擊三個單選按鈕,添加消息響應函數:void CMultiThread7Dlg::OnRadio1() { nAddend=10; } void CMultiThread7Dlg::OnRadio2() { nAddend=50; } void CMultiThread7Dlg::OnRadio3() { nAddend=100; } 并在OnInitDialog函數中完成相應的初始化工作: BOOL CMultiThread7Dlg::OnInitDialog() { ((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE); nAddend=10; …… 在MultiThread7Dlg.h中添加: #include "CalculateThread.h" #define WM_DISPLAY WM_USER+2 class CMultiThread7Dlg : public CDialog { // Construction public: CMultiThread7Dlg(CWnd* pParent = NULL); // standard constructor CCalculateThread* m_pCalculateThread; …… protected: int nAddend; LRESULT OnDisplay(WPARAM wParam,LPARAM lParam); …… 在MultiThread7Dlg.cpp中添加: BEGIN_MESSAGE_MAP(CMultiThread7Dlg, CDialog) …… ON_MESSAGE(WM_DISPLAY,OnDisplay) END_MESSAGE_MAP() LRESULT CMultiThread7Dlg::OnDisplay(WPARAM wParam,LPARAM lParam) { int nTemp=(int)wParam; SetDlgItemInt(IDC_STATUS,nTemp,FALSE); return 0; } 以上代碼使得主線程類CMultiThread7Dlg可以處理WM_DISPLAY消息,即在IDC_STATUS標簽框中顯示計算結果。 雙擊按鈕IDC_SUM,添加消息響應函數: void CMultiThread7Dlg::OnSum() { m_pCalculateThread= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread)); Sleep(500); m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL); } OnSum()函數的作用是建立CalculateThread線程,延時給該線程發送WM_CALCULATE消息。 右擊工程并選中“New Class…”為工程添加基類為 CWinThread 派生線程類 CCalculateThread。 在文件CalculateThread.h 中添加 #define WM_CALCULATE WM_USER+1 class CCalculateThread : public CWinThread { …… protected: afx_msg LONG OnCalculate(UINT wParam,LONG lParam); …… 在文件CalculateThread.cpp中添加 LONG CCalculateThread::OnCalculate(UINT wParam,LONG? lParam) { int nTmpt=0; for(int i=0;i<=(int)wParam;i++) { nTmpt=nTmpt+i; } Sleep(500); ::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL); return 0; } BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread) //{{AFX_MSG_MAP(CCalculateThread) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate) //和主線程對比,注意它們的區別 END_MESSAGE_MAP() 在CalculateThread.cpp文件的開頭添加一條: #include "MultiThread7Dlg.h" 以上代碼為 CCalculateThread 類添加了 WM_CALCULATE 消息,消息的響應函數是 OnCalculate,其功能是根據參數 wParam 的值,進行累加,累加結果在臨時變量nTmpt中,延時0.5秒,向主線程發送WM_DISPLAY消息進行顯示,nTmpt作為參數傳遞。 編譯并運行該例程,體會如何在線程間傳遞消息。 八、線程的同步 雖然多線程能給我們帶來好處,但是也有不少問題需要解決。例如,對于像磁盤驅動器這樣獨占性系統資源,由于線程可以執行進程的任 何代碼段,且線程的運行是由系統調度自動完成的,具有一定的不確定性,因此就有可能出現兩個線程同時對磁盤驅動器進行操作,從而出現 操作錯誤;又例如,對于銀行系統的計算機來說,可能使用一個線程來更新其用戶數據庫,而用另外一個線程來讀取數據庫以響應儲戶的需要 ,極有可能讀數據庫的線程讀取的是未完全更新的數據庫,因為可能在讀的時候只有一部分數據被更新過。 使隸屬于同一進程的各線程協調一致地工作稱為線程的同步。 MFC提供了多種同步對象,下面我們只介紹最常用的四種: 臨界區(CCriticalSection) 事件(CEvent) 互斥量(CMutex) 信號量(CSemaphore) 通過這些類,我們可以比較容易地做到線程同步。 A、使用 CCriticalSection 類 當多個線程訪問一個獨占性共享資源時,可以使用“臨界區”對象。任一時刻只有一個線程可以擁有臨界區對象,擁有臨界區的線程可以訪 問被保護起來的資源或代碼段,其他希望進入臨界區的線程將被掛起等待,直到擁有臨界區的線程放棄臨界區時為止,這樣就保證了不會在同 一時刻出現多個線程訪問共享資源。 CCriticalSection類的用法非常簡單,步驟如下: 定義CCriticalSection類的一個全局對象(以使各個線程均能訪問),如CCriticalSection critical_section; 在訪問需要保護的資源或代碼之前,調用CCriticalSection類的成員Lock()獲得臨界區對象: critical_section.Lock(); 在線程中調用該函數來使線程獲得它所請求的臨界區。如果此時沒有其它線程占有臨界區對象,則調用Lock()的線程獲得臨界區;否則,線程 將被掛起,并放入到一個系統隊列中等待,直到當前擁有臨界區的線程釋放了臨界區時為止。 訪問臨界區完畢后,使用CCriticalSection的成員函數Unlock()來釋放臨界區:critical_section.Unlock(); 再通俗一點講,就是線程A執行到critical_section.Lock();語句時,如果其它線程(B)正在執行critical_section.Lock();語句后且 critical_section. Unlock();語句前的語句時,線程A就會等待,直到線程B執行完critical_section. Unlock();語句,線程A才會繼續執行。 下面再通過一個實例進行演示說明。 例程8 MultiThread8 建立一個基于對話框的工程MultiThread8,在對話框IDD_MULTITHREAD8_DIALOG中加入兩個按鈕和兩個編輯框控件,兩個按鈕的ID分別為 IDC_WRITEW和IDC_WRITED,標題分別為“寫‘W’”和“寫‘D’”;兩個編輯框的ID分別為IDC_W和IDC_D,屬性都選中Read-only; 在MultiThread8Dlg.h文件中聲明兩個線程函數: UINT WriteW(LPVOID pParam); UINT WriteD(LPVOID pParam); 使用ClassWizard分別給IDC_W和IDC_D添加CEdit類變量m_ctrlW和m_ctrlD; 在MultiThread8Dlg.cpp文件中添加如下內容: 為了文件中能夠正確使用同步類,在文件開頭添加:#include "afxmt.h" 定義臨界區和一個字符數組,為了能夠在不同線程間使用,定義為全局變量:CCriticalSection critical_section; char g_Array[10]; 添加線程函數:UINT WriteW(LPVOID pParam) { CEdit *pEdit=(CEdit*)pParam; pEdit->SetWindowText(""); critical_section.Lock(); //鎖定臨界區,其它線程遇到critical_section.Lock();語句時要等待 //直至執行critical_section.Unlock();語句 for(int i=0;i<10;i++) { g_Array[i]=''W''; pEdit->SetWindowText(g_Array); Sleep(1000); } critical_section.Unlock(); return 0; } UINT WriteD(LPVOID pParam) { CEdit *pEdit=(CEdit*)pParam; pEdit->SetWindowText(""); critical_section.Lock(); //鎖定臨界區,其它線程遇到critical_section.Lock();語句時要等待 //直至執行critical_section.Unlock();語句 for(int i=0;i<10;i++) { g_Array[i]=''D''; pEdit->SetWindowText(g_Array); Sleep(1000); } critical_section.Unlock(); return 0; } 分別雙擊按鈕IDC_WRITEW和IDC_WRITED,添加其響應函數: void CMultiThread8Dlg::OnWritew() { CWinThread *pWriteW=AfxBeginThread(WriteW, &m_ctrlW, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pWriteW->ResumeThread(); } void CMultiThread8Dlg::OnWrited() { CWinThread *pWriteD=AfxBeginThread(WriteD, &m_ctrlD, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pWriteD->ResumeThread();
} 由于代碼較簡單,不再詳述。編譯、運行該例程,您可以連續點擊兩個按鈕,觀察體會臨界類的作用。 B、使用 CEvent 類 CEvent 類提供了對事件的支持。事件是一個允許一個線程在某種情況發生時,喚醒另外一個線程的同步對象。例如在某些網絡應用程序中,一個線程 (記為A)負責監聽通訊端口,另外一個線程(記為B)負責更新用戶數據。通過使用CEvent 類,線程A可以通知線程B何時更新用戶數據。每一個CEvent 對象可以有兩種狀態:有信號狀態和無信號狀態。線程監視位于其中的CEvent 類對象的狀態,并在相應的時候采取相應的操作。 在MFC中,CEvent 類對象有兩種類型:人工事件和自動事件。一個自動CEvent 對象在被至少一個線程釋放后會自動返回到無信號狀態;而人工事件對象獲得信號后,釋放可利用線程,但直到調用成員函數ReSetEvent()才 將其設置為無信號狀態。在創建CEvent 類的對象時,默認創建的是自動事件。 CEvent 類的各成員函數的原型和參數說明如下: 1、CEvent(BOOL bInitiallyOwn=FALSE, BOOL bManualReset=FALSE, LPCTSTR lpszName=NULL, LPSECURITY_ATTRIBUTES lpsaAttribute=NULL);
bInitiallyOwn:指定事件對象初始化狀態,TRUE為有信號,FALSE為無信號; bManualReset:指定要創建的事件是屬于人工事件還是自動事件。TRUE為人工事件,FALSE為自動事件; 后兩個參數一般設為NULL,在此不作過多說明。 2、BOOL CEvent::SetEvent(); 將 CEvent 類對象的狀態設置為有信號狀態。如果事件是人工事件,則 CEvent 類對象保持為有信號狀態,直到調用成員函數ResetEvent ()將 其重新設為無信號狀態時為止。如果CEvent 類對象為自動事件,則在SetEvent()將事件設置為有信號狀態后,CEvent 類對象由系統自動重置為無信號狀態。 如果該函數執行成功,則返回非零值,否則返回零。 3、BOOL CEvent::ResetEvent(); 該函數將事件的狀態設置為無信號狀態,并保持該狀態直至SetEvent()被調用時為止。由于自動事件是由系統自動重置,故自動事件不需 要調用該函數。如果該函數執行成功,返回非零值,否則返回零。我們一般通過調用WaitForSingleObject函數來監視事件狀態。前面我們已經 介紹了該函數。由于語言描述的原因,CEvent 類的理解確實有些難度,但您只要通過仔細回味下面例程,多看幾遍就可理解。 例程9 MultiThread9 建立一個基于對話框的工程MultiThread9,在對話框IDD_MULTITHREAD9_DIALOG中加入一個按鈕和兩個編輯框控件,按鈕的ID為IDC_WRITEW,標 題為“寫‘W’”;兩個編輯框的ID分別為IDC_W和IDC_D,屬性都選中Read-only; 在MultiThread9Dlg.h文件中聲明兩個線程函數: UINT WriteW(LPVOID pParam); UINT WriteD(LPVOID pParam); 使用ClassWizard分別給IDC_W和IDC_D添加CEdit類變量m_ctrlW和m_ctrlD; 在MultiThread9Dlg.cpp文件中添加如下內容: 為了文件中能夠正確使用同步類,在文件開頭添加 #include "afxmt.h" 定義事件對象和一個字符數組,為了能夠在不同線程間使用,定義為全局變量。 CEvent eventWriteD; char g_Array[10]; 添加線程函數: UINT WriteW(LPVOID pParam) { CEdit *pEdit=(CEdit*)pParam; pEdit->SetWindowText(""); for(int i=0;i<10;i++) { g_Array[i]=''W''; pEdit->SetWindowText(g_Array); Sleep(1000); } eventWriteD.SetEvent(); return 0; } UINT WriteD(LPVOID pParam) { CEdit *pEdit=(CEdit*)pParam; pEdit->SetWindowText(""); WaitForSingleObject(eventWriteD.m_hObject,INFINITE); for(int i=0;i<10;i++) { g_Array[i]=''D''; pEdit->SetWindowText(g_Array); Sleep(1000); } return 0; } 仔細分析這兩個線程函數, 您就會正確理解CEvent 類。線程WriteD執行到 WaitForSingleObject(eventWriteD.m_hObject,INFINITE);處等待,直到事件eventWriteD為有信號該線程才往下執行,因為eventWriteD對象 是自動事件,則當WaitForSingleObject()返回時,系統自動把eventWriteD對象重置為無信號狀態。 雙擊按鈕IDC_WRITEW,添加其響應函數: void CMultiThread9Dlg::OnWritew() { CWinThread *pWriteW=AfxBeginThread(WriteW, &m_ctrlW, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pWriteW->ResumeThread(); CWinThread *pWriteD=AfxBeginThread(WriteD, &m_ctrlD, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pWriteD->ResumeThread(); } 編譯并運行程序,單擊“寫‘W’”按鈕,體會事件對象的作用。 C、使用CMutex 類 互斥對象與臨界區對象很像.互斥對象與臨界區對象的不同在于:互斥對象可以在進程間使用,而臨界區對象只能在同一進程的各線程間使用 。當然,互斥對象也可以用于同一進程的各個線程間,但是在這種情況下,使用臨界區會更節省系統資源,更有效率。 D、使用CSemaphore 類 當需要一個計數器來限制可以使用某個線程的數目時,可以使用“信號量”對象。CSemaphore 類的對象保存了對當前訪問某一指定資源的線程的計數值,該計數值是當前還可以使用該資源的線程的數目。如果這個計數達到了零,則所有 對這個CSemaphore 類對象所控制的資源的訪問嘗試都被放入到一個隊列中等待,直到超時或計數值不為零時為止。一個線程被釋放已訪問了被保護的資源時,計 數值減1;一個線程完成了對被控共享資源的訪問時,計數值增1。這個被CSemaphore 類對象所控制的資源可以同時接受訪問的最大線程數在該對象的構建函數中指定。 CSemaphore 類的構造函數原型及參數說明如下: CSemaphore (LONG lInitialCount=1, LONG lMaxCount=1, LPCTSTR pstrName=NULL, LPSECURITY_ATTRIBUTES lpsaAttributes=NULL); lInitialCount:信號量對象的初始計數值,即可訪問線程數目的初始值; lMaxCount:信號量對象計數值的最大值,該參數決定了同一時刻可訪問由信號量保護的資源的線程最大數目; 后兩個參數在同一進程中使用一般為NULL,不作過多討論; 在用CSemaphore 類的構造函數創建信號量對象時要同時指出允許的最大資源計數和當前可用資源計數。一般是將當前可用資源計數設置為最大資源計數,每增 加一個線程對共享資源的訪問,當前可用資源計數就會減1,只要當前可用資源計數是大于0的,就可以發出信號量信號。但是當前可用計數減 小到0時,則說明當前占用資源的線程數已經達到了所允許的最大數目,不能再允許其它線程的進入,此時的信號量信號將無法發出。線程在處 理完共享資源后,應在離開的同時通過ReleaseSemaphore()函數將當前可用資源數加1。 下面給出一個簡單實例來說明 CSemaphore 類的用法。 例程10 MultiThread10 建立一個基于對話框的工程MultiThread10,在對話框IDD_MULTITHREAD10_DIALOG中加入一個按鈕和三個編輯框控件,按鈕的ID為IDC_START, 標題為“同時寫‘A’、‘B’、‘C’”;三個編輯框的ID分別為IDC_A、IDC_B和IDC_C,屬性都選中Read-only; 在MultiThread10Dlg.h文件中聲明兩個線程函數: UINT WriteA(LPVOID pParam); UINT WriteB(LPVOID pParam); UINT WriteC(LPVOID pParam); 使用ClassWizard分別給IDC_A、IDC_B和IDC_C添加CEdit類變量m_ctrlA、m_ctrlB和m_ctrlC; 在MultiThread10Dlg.cpp文件中添加如下內容: 為了文件中能夠正確使用同步類,在文件開頭添加: #include "afxmt.h" 定義信號量對象和一個字符數組,為了能夠在不同線程間使用,定義為全局變量:CSemaphore semaphoreWrite(2,2); //資源最多訪問線程2個,當前可訪問線程數2個 char g_Array[10]; 添加三個線程函數: UINT WriteA(LPVOID pParam) { CEdit *pEdit=(CEdit*)pParam; pEdit->SetWindowText(""); WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE); CString str; for(int i=0;i<10;i++) { pEdit->GetWindowText(str); g_Array[i]=''A''; str=str+g_Array[i]; pEdit->SetWindowText(str); Sleep(1000); } ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL); return 0; } UINT WriteB(LPVOID pParam) { CEdit *pEdit=(CEdit*)pParam; pEdit->SetWindowText(""); WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE); CString str; for(int i=0;i<10;i++) { pEdit->GetWindowText(str); g_Array[i]=''B''; str=str+g_Array[i]; pEdit->SetWindowText(str); Sleep(1000); } ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL); return 0; } UINT WriteC(LPVOID pParam) { CEdit *pEdit=(CEdit*)pParam; pEdit->SetWindowText(""); WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE); for(int i=0;i<10;i++) { g_Array[i]=''C''; pEdit->SetWindowText(g_Array); Sleep(1000); } ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL); return 0; } 這三個線程函數不再多說。在信號量對象有信號的狀態下,線程執行到WaitForSingleObject語句處繼續執行,同時可用線程數減1;若線程執 行到WaitForSingleObject語句時信號量對象無信號,線程就在這里等待,直到信號量對象有信號線程才往下執行。 雙擊按鈕IDC_START,添加其響應函數: void CMultiThread10Dlg::OnStart() { CWinThread *pWriteA=AfxBeginThread(WriteA, &m_ctrlA, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pWriteA->ResumeThread(); CWinThread *pWriteB=AfxBeginThread(WriteB, &m_ctrlB, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pWriteB->ResumeThread(); CWinThread *pWriteC=AfxBeginThread(WriteC, &m_ctrlC, THREAD_PRIORITY_NORMAL, 0, ? ? CREATE_SUSPENDED); pWriteC->ResumeThread(); }

轉載于:https://my.oschina.net/laopiao/blog/121983

總結

以上是生活随笔為你收集整理的VC++多线程编程[转]的全部內容,希望文章能夠幫你解決所遇到的問題。

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

日韩资源在线观看 | 97超碰人人澡人人 | 天天操一操 | 夜夜躁日日躁狠狠躁 | 精品国产乱码久久久久久久 | 日韩女同av | 日韩久久精品一区二区 | 国产在线高清 | 日韩一二区在线 | 99这里只有精品视频 | 韩日av一区二区 | 国产香蕉久久 | 欧洲精品亚洲精品 | 久久综合久久88 | 国产日韩精品欧美 | 国产成人久久精品一区二区三区 | 黄色影院在线免费观看 | av三级在线免费观看 | 久久九九精品 | 欧美日韩免费看 | 波多野结衣在线播放一区 | 婷婷色在线视频 | 亚洲清纯国产 | 亚洲精品xxxx | 黄网站色欧美视频 | 亚洲综合射 | 国产美女无遮挡永久免费 | 久久婷婷综合激情 | 国产第一页在线观看 | 91网址在线观看 | 99精品国产在热久久下载 | 黄色一级在线免费观看 | 国产日产在线观看 | 国产不卡av在线播放 | 久久精品久久国产 | 亚洲综合色激情五月 | 91人人澡人人爽 | 国产精品99久久久 | 国产精品乱码高清在线看 | 中文字幕在线播放一区 | 国产精品久久一区二区三区, | 久久久久国产成人免费精品免费 | 亚洲日本韩国一区二区 | 欧美视频不卡 | 一本色道久久综合亚洲二区三区 | 日韩av综合网站 | 国产精品久久久久久久毛片 | 免费一级片视频 | 激情久久久久久久久久久久久久久久 | 免费看三级网站 | 激情视频国产 | 久久综合操 | 久久99热国产 | 国产一级电影 | 九九免费在线观看 | 国产精品电影一区二区 | 91免费在线视频 | 久久精品网站免费观看 | 成年人视频在线免费播放 | 天堂网一区二区三区 | 久久久久影视 | 欧美激情视频一区 | 欧美999 | 最新日本中文字幕 | 国产精品久久久av久久久 | 欧美日韩aaaa | 国产精品去看片 | 成人午夜电影免费在线观看 | 久久久综合色 | 久久久午夜电影 | 日韩成人欧美 | 日韩久久激情 | 婷婷九九 | 中文字幕免费播放 | 伊人天天狠天天添日日拍 | 激情黄色av| 日韩精品免费一线在线观看 | 久久久香蕉视频 | 亚州黄色一级 | 黄网站色视频 | 91av综合| 久久香蕉国产 | 天天操综 | 色偷偷男人的天堂av | 日日日操操 | 色婷婷亚洲精品 | 亚洲v精品| 一区二区av | 69性欧美 | 99色视频在线| av成人免费观看 | 国产九九热 | 在线电影 你懂得 | 成人羞羞视频在线观看免费 | 欧美成人播放 | 91漂亮少妇露脸在线播放 | 国产直播av | 亚洲激情在线观看 | 亚洲天堂精品视频在线观看 | 亚洲综合导航 | 爱色av.com | 狠狠色2019综合网 | 一级黄色片在线观看 | 亚洲日韩中文字幕 | 国产一卡二卡四卡国 | 久久亚洲综合国产精品99麻豆的功能介绍 | 午夜精品久久久久 | 久久久一本精品99久久精品 | 国产又粗又猛又色又黄视频 | 蜜臀久久99精品久久久无需会员 | 99亚洲国产| 国产va饥渴难耐女保洁员在线观看 | 99 久久久久 | 国产黑丝一区二区三区 | 99久久久国产免费 | 999视频网| 99久久精品网 | 五月婷婷激情网 | 国产成人精品一区二区在线观看 | 国语自产偷拍精品视频偷 | 五月婷婷六月综合 | 国产精品系列在线播放 | 婷香五月| 精品亚洲午夜久久久久91 | 久久午夜电影网 | 亚洲精品在线免费看 | 日本久久久久久科技有限公司 | 中文字幕久久网 | 成人香蕉视频 | 亚洲一级电影在线观看 | 日韩欧美高清免费 | 国产视频二区三区 | 国际精品久久 | 欧美在线视频一区二区三区 | 国产一级一片免费播放放 | 天天色综合久久 | 国产福利精品一区二区 | 五月婷婷综合激情 | 中文一区二区三区在线观看 | 99久久久久成人国产免费 | 日韩中文字幕在线 | www日韩在线| 亚洲视频久久久久 | 精品在线小视频 | 西西4444www大胆无视频 | 操操操com| 久久精品中文 | 免费在线观看成年人视频 | 91精品1区2区| 国产手机视频 | 国产一二区在线观看 | 人人澡人人干 | 久久久国产精品网站 | 日韩精品一区二区三区外面 | 日韩电影一区二区在线观看 | 亚洲最快最全在线视频 | 久久国产91 | 啪啪资源 | 亚洲免费不卡 | 国产四虎在线 | 国产精品99久久久久久久久久久久 | 麻豆传媒在线视频 | 国产精品免费在线视频 | 一区二区视频欧美 | 黄色日本免费 | 日日干影院 | 玖玖在线免费视频 | 免费在线观看毛片网站 | 成人在线免费看视频 | 精品二区视频 | 国产精品久久久久久久久久东京 | 亚洲好视频 | 午夜免费久久看 | www色,com| 久久国产精品一国产精品 | 成人精品久久 | 国产区在线 | 日韩精品中文字幕在线观看 | 国产在线中文字幕 | 亚洲欧美一区二区三区孕妇写真 | 亚洲精品久久久蜜桃 | 狠狠干2018 | 欧美大片大全 | 日本成人黄色片 | 天天激情在线 | 国产亚洲精品中文字幕 | 久久一区91| 又黄又爽又湿又无遮挡的在线视频 | 最新日韩在线观看 | 91视频这里只有精品 | 香蕉影院在线观看 | 五月亚洲| 亚洲欧美日韩精品久久奇米一区 | 日韩在线视频一区二区三区 | 中文字幕乱码电影 | 免费观看高清 | 欧美电影黄色 | 亚洲精品综合在线观看 | 久久精品中文视频 | 欧美日韩不卡一区 | 美女精品久久久 | 视频一区二区在线观看 | 亚洲天堂激情 | 欧美日韩不卡在线 | 欧美激情精品久久久久久 | 97精品国自产拍在线观看 | 中文字幕国产精品一区二区 | 97国产大学生情侣白嫩酒店 | 国产韩国精品一区二区三区 | 91免费网站在线观看 | 久久爱导航| 亚洲欧美日韩国产精品一区午夜 | 亚洲精品456在线播放乱码 | 免费成人结看片 | 欧美乱淫视频 | 视频在线99re | 欧美大片在线看免费观看 | 免费在线观看视频一区 | 一区二区 不卡 | 成人国产一区 | 国产精品毛片一区二区在线看 | 免费69视频| 日本黄色a级大片 | 久久国产精品电影 | 在线播放一区二区三区 | 国产粉嫩在线观看 | 99视频精品视频高清免费 | 日韩中文字幕在线看 | 成年人国产精品 | 国产一区免费在线 | 色的网站在线观看 | av免费成人 | 中文字幕有码在线观看 | 91香蕉视频在线下载 | 人人澡人人干 | 婷婷丁香av | 日韩精品视频免费专区在线播放 | 香蕉视频网址 | 在线只有精品 | 日韩黄色av网站 | av播放在线 | 国产美女免费观看 | 99久久婷婷国产一区二区三区 | 日韩视频在线观看视频 | 一级大片在线观看 | 欧美日韩中文视频 | 亚洲色图色 | 久久久久久久久精 | 国产精品久久久久久久久毛片 | 国产精品久久久久久久久久久久久 | 国产精品综合久久久久久 | 五月婷综合网 | av电影一区二区三区 | 麻豆视频免费版 | 黄色在线观看免费网站 | 国产伦理久久精品久久久久_ | 三日本三级少妇三级99 | 国产精品美乳一区二区免费 | 日韩精品五月天 | 成人免费网视频 | 日韩中文字幕视频在线观看 | 久99久精品 | 国产中的精品av小宝探花 | 欧美日韩国产mv | 精品夜夜嗨av一区二区三区 | 欧美午夜久久久 | 日韩电影在线视频 | 99精品视频免费 | 伊人日日干 | 97色国产| 中文字幕成人一区 | 91精品伦理 | 日韩av黄| 国产99精品在线观看 | 久草在线视频中文 | 免费h精品视频在线播放 | 麻豆一区二区三区视频 | 天堂av高清 | av一区二区三区在线播放 | 97电影在线观看 | 日韩 在线观看 | 制服丝袜亚洲 | 久久久精品欧美 | 日本精品视频网站 | 欧美嫩草影院 | 亚洲久草视频 | 欧美日韩亚洲精品在线 | 免费高清看电视网站 | 91免费黄视频 | 手机看片国产 | 国产精品理论片在线播放 | 亚洲码国产日韩欧美高潮在线播放 | 91成品人影院 | 免费在线观看的av网站 | 亚洲狠狠干 | 久久免费av | 国产精品手机播放 | 日韩综合色 | 天天干天天操天天爱 | 国外av在线 | av五月婷婷 | 国产一区视频在线播放 | 免费在线黄色av | 免费色视频网址 | 伊人资源站 | 国精产品永久999 | 婷婷国产一区二区三区 | 国产黄色一级大片 | 超碰在线99 | 少妇bbr搡bbb搡bbb | 日韩欧美国产精品 | 中文字幕一区二区三区四区 | 亚洲更新最快 | 天天操天天操天天 | 免费 在线 中文 日本 | 成人免费在线观看电影 | 国产一二三区在线观看 | 免费精品国产 | 国产999久久久 | 综合色久 | 麻豆 videos| av在线播放快速免费阴 | 免费欧美精品 | 亚洲精品在线视频 | 国产亚洲精品女人久久久久久 | 日本狠狠干 | 91精品推荐 | 毛片网在线观看 | 精品一区二区综合 | 最新国产在线观看 | 国产精成人品免费观看 | 欧美乱码精品一区 | 中文字幕视频网站 | 丁香av | 中文字幕国产视频 | 国产经典av | 成人黄色av免费在线观看 | 丁香六月婷婷开心 | 成片人卡1卡2卡3手机免费看 | 99久久国产免费免费 | 免费在线观看av网址 | 2022久久国产露脸精品国产 | 国产成人av网站 | 欧美另类交人妖 | 五月综合激情 | 久草免费在线视频 | 色狠狠婷婷 | 免费网站在线 | 日韩欧美精品一区二区 | 在线免费观看av网站 | 国产高清视频在线免费观看 | 不卡中文字幕av | 亚洲精品18日本一区app | 91成人蝌蚪 | 在线播放你懂 | 中文字幕2021| 女人18毛片a级毛片一区二区 | 成人欧美一区二区三区黑人麻豆 | 日韩午夜一级片 | 97人人精品 | 国产午夜精品一区二区三区 | 狠狠狠综合 | 黄色片亚洲 | 免费看污污视频的网站 | 久久久成人精品 | 午夜少妇一区二区三区 | 日本xxxx.com| 免费看污在线观看 | 三级av小说| 天天操夜夜叫 | 久草在线精品观看 | 亚洲国产精品久久久久 | 欧美成年人在线视频 | 色视频国产直接看 | 最近中文字幕视频完整版 | 免费视频黄色 | 久久99精品国产麻豆宅宅 | 国产福利一区二区在线 | 九九久久久久久久久激情 | 干天天| 99精品乱码国产在线观看 | av看片在线观看 | 国产在线毛片 | 欧美精品成人在线 | 欧美日韩精品免费观看视频 | 亚州国产精品 | 日韩精品三区四区 | 久久精品免费 | 亚洲第一成网站 | 欧美另类xxx | 国产精品久久久久久久午夜 | 国产五码一区 | 丝袜美腿在线播放 | 人人干在线观看 | 久久久国产精品成人免费 | 国产精品手机在线 | 亚洲综合视频在线播放 | 天天干夜夜操视频 | 婷婷久久丁香 | 国产最新福利 | 久久综合操 | 亚洲一级黄色 | 日韩大片在线观看 | 成人影视片| 91亚洲成人| 国产丝袜制服在线 | 久久精品8 | 国产高清在线视频 | 天天干天天草天天爽 | 免费韩国av | 超碰在线公开免费 | 91av精品| 五月婷婷网站 | 18久久久久久 | 一级片在线 | 中文字幕免费高清在线 | 国产日韩一区在线 | 久久伦理视频 | 深夜国产在线 | 麻豆精品传媒视频 | 超碰在线中文字幕 | 99精品黄色| 婷婷丁香七月 | 日韩在线免费电影 | 黄色三级视频片 | 亚洲狠狠婷婷综合久久久 | 欧美日韩视频在线播放 | 久在线观看视频 | 五月婷婷久 | 波多野结衣在线视频免费观看 | 久久久三级视频 | 亚洲a成人v | 最近中文字幕完整视频高清1 | 久久久久久久久久久久av | 久久久久久久18 | 超碰人人av | 香蕉视频啪啪 | 国产一区二区精品在线 | 欧美国产精品久久久久久免费 | 99视频精品免费视频 | 男女啪啪网站 | 欧美国产高清 | 色婷婷视频在线观看 | 97品白浆高清久久久久久 | 亚洲精品乱码久久久久久高潮 | 亚洲激精日韩激精欧美精品 | 在线观看视频黄色 | 婷婷在线不卡 | 免费观看91 | 1000部国产精品成人观看 | 黄色电影在线免费观看 | 日韩精品视频一二三 | 肉色欧美久久久久久久免费看 | 国产在线播放一区 | 久草在线观看视频免费 | 久久国产成人午夜av影院潦草 | 色综合久久久久综合99 | 视频二区在线 | av电影av在线| 有码中文字幕在线观看 | 久久资源总站 | 亚洲国产精品一区二区久久,亚洲午夜 | 久久国内精品99久久6app | 色婷婷中文 | 欧美激情精品久久久 | 日韩午夜高清 | 99色免费视频 | 久久精品国产一区二区三 | 国产在线黄 | 国产免费观看高清完整版 | 午夜精品一区二区国产 | 久草久热| 国产精品99久久久久的智能播放 | 草久中文字幕 | 91麻豆精品国产91久久久无需广告 | 久久久亚洲麻豆日韩精品一区三区 | 国产精品视频久久 | 在线日韩av | 一级欧美一级日韩 | 国产99视频在线观看 | 手机在线黄色网址 | 黄色av免费看 | 久久久久久久久久久影院 | 一区二区三区在线免费观看 | 欧美午夜精品久久久久 | 韩日在线一区 | 黄色视屏免费在线观看 | 欧美一区免费在线观看 | 欧美性色19p | 国产 日韩 欧美 自拍 | 中文国产在线观看 | 九九九九热精品免费视频点播观看 | 国产伦精品一区二区三区免费 | 青青河边草免费观看完整版高清 | 天天爱天天插 | 精品国产精品国产偷麻豆 | 日本韩国精品一区二区在线观看 | 国产精品五月天 | 中文在线免费一区三区 | 在线黄色免费 | 天天综合网天天综合色 | 一区二区视 | 99热这里精品 | 久久精品久久精品久久 | 在线免费观看视频你懂的 | 国产一级精品在线观看 | 天堂av官网 | 在线观看免费黄色 | 亚洲黄色免费在线看 | 在线播放 日韩专区 | 中文字幕久久精品 | 一区二区三区在线看 | 色a资源在线 | 欧美在线视频免费 | 91高清完整版在线观看 | 特黄特色特刺激视频免费播放 | 久久97超碰 | 99精品国产福利在线观看免费 | 欧美做受高潮电影o | 国产成本人视频在线观看 | 六月色播| 国产精品久久电影网 | 三级黄色a | 摸阴视频| 国产视频二区三区 | 国产亚洲欧美日韩高清 | 福利视频 | 蜜桃视频在线视频 | 一级免费黄视频 | 国产精品大片免费观看 | 日日夜夜网 | a级一a一级在线观看 | 国产精品自产拍在线观看蜜 | 香蕉视频网站在线观看 | 国产 中文 日韩 欧美 | 91视频在线免费 | 欧美高清视频不卡网 | 永久免费视频国产 | 精品久久久一区二区 | 91中文字幕永久在线 | 伊人狠狠色| 五月婷婷丁香在线观看 | 在线观看第一页 | 亚洲日韩精品欧美一区二区 | 91夜夜夜 | 超薄丝袜一二三区 | 日韩视频一区二区在线观看 | 国产精品美女免费视频 | 国产二区电影 | 美女国内精品自产拍在线播放 | a在线观看视频 | 三级av网| 久草a在线 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 中文字幕精品一区二区三区电影 | 操操色 | 日本黄色a级大片 | 免费av网址在线观看 | 免费看91的网站 | 国产中文字幕视频在线 | 天天干天天干天天 | 亚洲成a人片综合在线 | 欧美性极品xxxx娇小 | 精品国产一区二区三区蜜臀 | 一本一本久久a久久精品牛牛影视 | 青青河边草免费观看 | 免费在线观看午夜视频 | 特黄色大片 | 国产精品原创 | 亚洲精品久久久久中文字幕二区 | 中文字幕你懂的 | 亚洲激情久久 | 国产一二三四在线视频 | 国产黄色在线观看 | 成年人国产视频 | 免费久草视频 | 黄色三级网站在线观看 | 中文字幕在线看视频国产中文版 | 久久久久久久久福利 | 99久久这里只有精品 | 91精品国产麻豆国产自产影视 | 在线观看免费版高清版 | 狠狠综合久久av | 国产精品手机在线观看 | 日本公妇在线观看 | 婷婷六月综合亚洲 | 国产无遮挡猛进猛出免费软件 | 日韩精品中文字幕在线 | 久久无码精品一区二区三区 | 男女啪啪视屏 | 久久综合欧美精品亚洲一区 | 免费视频xnxx com | 国产精品第 | 久草免费手机视频 | 国产精品18久久久久久vr | 欧美国产高清 | 免费成人av在线 | 91精品国产成 | 国产成人三级 | 色免费在线| 国产不卡一二三区 | 天天色综合1 | 最近中文字幕免费视频 | 色欧美综合 | 91精品办公室少妇高潮对白 | 人人爽影院 | 在线黄色国产电影 | 久久午夜精品影院一区 | av日韩中文 | 日韩激情精品 | 国产精品嫩草影院99网站 | 成人av免费电影 | 精品视频网站 | 欧美日韩高清一区二区 国产亚洲免费看 | 国产一区二区不卡视频 | 欧美精品在线一区二区 | 婷婷丁香狠狠爱 | 欧美日韩免费观看一区=区三区 | 99精品国产成人一区二区 | 五月天狠狠操 | 狠狠操导航 | 国产又粗又猛又黄 | 天天操网址| 国产中文字幕视频 | 欧美成人免费在线 | 亚洲精品裸体 | 婷婷丁香花五月天 | 亚洲精品91天天久久人人 | 免费在线色电影 | 麻豆免费精品视频 | 国产伦精品一区二区三区无广告 | 久久成人精品视频 | 夜夜操天天干 | 99久e精品热线免费 99国产精品久久久久久久久久 | www在线观看视频 | 国产精品美女www爽爽爽视频 | 天堂素人在线 | 天天干天天综合 | 波多野结衣最新 | 免费看高清毛片 | 中文视频一区二区 | 亚洲精品在线二区 | 五月婷婷免费 | 国产精美视频 | 中文字幕你懂的 | 久久丁香| 国产一区二区视频在线播放 | 色网站中文字幕 | 国产免费片 | 欧美日韩高清 | 成人一区二区三区在线观看 | 日韩大片在线 | 亚洲区视频在线 | 999久久久欧美日韩黑人 | 五月婷婷激情综合 | 九九涩涩av台湾日本热热 | 色中色亚洲 | 亚洲国产精品小视频 | 1000部18岁以下禁看视频 | 高清av免费一区中文字幕 | 久久视频在线观看免费 | 99久久精品日本一区二区免费 | 一本一本久久aa综合精品 | 成人丝袜 | 久久综合免费视频影院 | 久久久91精品国产一区二区精品 | 国产高清专区 | 久久久久久久久久久网 | 人人澡超碰碰97碰碰碰软件 | 久草视频免费在线播放 | 日本激情动作片免费看 | 国产精品刺激对白麻豆99 | 国产999精品久久久久久麻豆 | 青春草视频 | 国产精品成人免费一区久久羞羞 | 99久久久久久久久 | 日本久久免费视频 | 色多多污污在线观看 | 香蕉精品视频在线观看 | www.久久91| 99在线高清视频在线播放 | 久久成人资源 | 亚洲精品久久在线 | 视频福利在线 | 黄色电影网站在线观看 | 久久理伦片| 最近中文字幕完整高清 | 日日操日日插 | 久久中文视频 | 成人高清av在线 | av资源免费看 | 色网站黄| 免费看黄在线 | 在线免费av播放 | 日韩一区二区在线免费观看 | 精品久久久久一区二区国产 | 国产中文字幕av | 久久黄色影视 | 久久久久久久电影 | 女人高潮一级片 | 中文字幕乱在线伦视频中文字幕乱码在线 | av品善网 | 亚洲国产成人精品在线 | 99久久精品日本一区二区免费 | 久久久精品国产免费观看一区二区 | 五月亚洲综合 | 久久久综合精品 | 午夜av电影院 | 欧美国产精品一区二区 | av一级片网站 | 免费福利小视频 | 在线免费看黄网站 | 少妇高潮流白浆在线观看 | 日本久久电影网 | 成人黄色av网站 | 日韩精品免费一区二区 | 美女av电影 | 久久全国免费视频 | 成 人 黄 色 免费播放 | 1000部18岁以下禁看视频 | 日韩理论在线观看 | 四虎成人精品永久免费av | 国产中文字幕三区 | 99久久日韩精品免费热麻豆美女 | 久久国产乱| 黄色网在线免费观看 | 久久久久国产精品视频 | 在线蜜桃视频 | 日韩欧美精品一区二区三区经典 | 日韩午夜精品 | 国产成人福利在线观看 | 韩日av在线| 欧美不卡视频在线 | 午夜在线日韩 | 亚洲午夜精品电影 | 精品久久久久久亚洲综合网 | 亚洲精品啊啊啊 | 日韩午夜高清 | 日本高清免费中文字幕 | 亚洲天堂自拍视频 | www.综合网.com | 色吊丝av中文字幕 | 91精品国自产在线 | 国产伦精品一区二区三区… | 在线免费观看的av网站 | 麻豆果冻剧传媒在线播放 | 欧美日韩性| 欧美日韩在线观看一区 | 超碰97人人爱 | 国产福利一区二区在线 | 久久蜜桃av | av电影在线观看 | 干综合网 | av在线播放观看 | 中文字幕高清在线播放 | 综合黄色网 | 久亚洲 | 97在线免费观看 | 亚洲最新视频在线播放 | 久久精品4| 久久人人爽人人片 | 精品极品在线 | 91人人爽久久涩噜噜噜 | 亚洲综合日韩在线 | 九九热只有这里有精品 | www.夜夜夜 | 亚洲精品美女久久17c | 日韩动漫免费观看高清完整版在线观看 | 激情婷婷色| 久久久久 免费视频 | 久草视频播放 | a久久久久 | 最近中文字幕视频网 | 久久久久夜色 | av网站地址 | 日本公妇在线观看高清 | a极黄色片 | 99精品毛片 | 91精品久| 青青河边草观看完整版高清 | 超碰97成人| 九九色网 | 日韩av中文 | 久久精品99国产精品日本 | 亚洲精品国产精品国自产观看 | 免费看一级特黄a大片 | 久久国产精品免费一区 | 免费黄在线观看 | 91喷水 | 日韩在线视频看看 | 99久国产 | 91精品国产入口 | 色噜噜日韩精品一区二区三区视频 | 国产婷婷色 | 亚洲国产精品日韩 | 国产99久久久国产精品免费看 | 天天干天天操av | 91精品少妇偷拍99 | 国产欧美精品一区二区三区 | 国产精品毛片一区二区 | 免费人成在线观看网站 | 国产精品6| 国内精品视频免费 | 久久视频在线视频 | 欧美成人91 | 午夜精品一区二区三区可下载 | 成人福利在线 | 中文字幕免费观看 | 五月天狠狠操 | 在线观看视频日韩 | 伊人电影天堂 | 国产精久久久 | 亚洲禁18久人片 | 亚洲国产成人在线播放 | 在线不卡a | 在线观看日韩国产 | www黄色 | 91亚洲精品国产 | 中文字幕一区二区三区久久 | 国产精品成人免费精品自在线观看 | av看片在线观看 | 国产精品美女久久久久aⅴ 干干夜夜 | 毛片网在线播放 | 中文不卡视频 | 亚洲一区二区视频 | 香蕉影院在线 | 久草视频免费看 | 精品日韩中文字幕 | 亚洲精品在线电影 | 久久久久久国产一区二区三区 | 奇米影视777影音先锋 | 又黄又爽又无遮挡的视频 | 麻豆国产精品一区二区三区 | 91网址在线 | 96av在线视频 | 最新亚洲视频 | 超碰在线人人艹 | 福利视频一二区 | 久久人视频| 超碰日韩在线 | 免费网站在线观看成人 | 午夜精品区 | 久久超碰网 | av 在线观看 | 少妇精品久久久一区二区免费 | 女人18毛片a级毛片一区二区 | 97精品国产97久久久久久久久久久久 | 成 人 黄 色 免费播放 | 色综合色综合久久综合频道88 | 日韩试看 | 在线亚洲小视频 | 91aaa在线观看| 亚洲精品视频中文字幕 | 国产成人久久精品77777 | 天堂av中文字幕 | 国产一级片免费视频 | 99视频这里有精品 | 久久视了 | 97超碰伊人| 欧美激情视频在线免费观看 | 国产精品1区2区在线观看 | 久久五月精品 | 日韩三级久久 | 亚洲国产午夜 | 四虎www. | 欧美黄在线 | 久草视频在线免费播放 | 97理论片 | 91九色蝌蚪国产 | 97免费视频在线 | 一区二区视频在线看 | 国产精品网站一区二区三区 | 999精品视频 | 国产精品扒开做爽爽的视频 | 在线国产中文字幕 | 一级黄色片在线观看 | 一级成人免费 | 亚洲成人av影片 | 一区二区三区电影在线播 | 国产成人精品一区二区在线 | 视频91在线 | 激情综合色播五月 | 91成人在线观看高潮 | 青草视频免费观看 | 欧美成人黄 | 午夜视频在线瓜伦 | 色激情在线 | 欧美色图视频一区 | 色综合国产| 国产高清日韩 | 亚洲激情综合网 | 国产在线观看a | 亚洲欧洲精品一区二区 | 波多野结衣视频一区二区 | 日韩电影一区二区三区 | 欧美成人理伦片 | 久在线观看视频 | 国产四虎影院 | 天天夜操 | 国外调教视频网站 | 亚洲精品在线视频播放 | 一级淫片在线观看 | 99精品视频99 | 国产精品第十页 | 国产男女无遮挡猛进猛出在线观看 | 三上悠亚一区二区在线观看 | 午夜久久久久久久久 | 亚洲最大成人网4388xx | 国产日韩欧美在线观看 | 国产精品美女网站 | 亚洲乱码久久久 | 欧美综合在线视频 | 成人黄色电影在线 | 97超级碰碰 | 丁香六月久久综合狠狠色 | 在线观看国产亚洲 | 午夜精品一区二区三区免费视频 | 国产精品毛片一区视频 | 久草在线视频首页 | 欧美另类xxxx| a级国产乱理伦片在线观看 亚洲3级 | 久久久福利 | 亚洲第一香蕉视频 | 国产在线不卡一区 | 亚洲欧美色婷婷 | 中文字幕成人 | 一区二区三区不卡在线 | 日韩色综合 | 久精品视频免费观看2 | 国产一区二区不卡视频 | 亚洲丁香久久久 | 六月天综合网 | 国产精品美女久久久免费 | 在线免费黄网站 | 99产精品成人啪免费网站 | 国产精品观看 | 国产一级视频在线免费观看 | 国产破处在线播放 | 日本久久久久久久久久久 | 日韩久久精品一区二区三区下载 | 狠狠狠色丁香综合久久天下网 | 免费观看成人av | 在线成人高清电影 | 五月天综合色激情 | 午夜婷婷在线播放 | 在线 欧美 日韩 | 免费视频a | 久久99久久精品国产 | 中文字幕在线国产精品 | 亚洲黄色在线观看 | 在线 日韩 av | 久久狠狠亚洲综合 | 亚洲综合激情 | 一级片视频免费观看 | 精品欧美一区二区精品久久 | 日韩在线观看网址 | 久艹视频在线观看 | 免费看黄色小说的网站 | 免费精品人在线二线三线 | 国产精品色视频 | 九九日九九操 | 欧美国产三区 | 中文字幕第一页在线播放 | 麻豆国产在线视频 | 久久国产精品免费视频 | 一本一本久久a久久精品牛牛影视 | 久草在线资源免费 | 精品特级毛片 | 色悠悠久久综合 | 99久久精品免费视频 | 久草在线免费新视频 | www.天天干| 亚洲一区二区视频在线播放 | 国产高清视频在线播放一区 | 91av99| 国产美女视频免费观看的网站 | 在线观看中文字幕2021 | www激情网 | 精品一区二区在线免费观看 | 成人午夜剧场在线观看 | 久久免费视频在线 | 欧美aa在线 | 青青草国产成人99久久 | 9999精品视频 | 久久久精品国产免费观看一区二区 | 欧美黄色特级片 | 国产黄a三级三级 | 亚洲一区二区高潮无套美女 | 国产二区免费视频 | 欧美91在线| 精品美女国产在线 | 久草99 | 中文字幕日韩有码 | 久久综合影音 | 九色精品免费永久在线 | 69欧美视频| 免费国产在线视频 | 久久午夜视频 |