2014-09-04 91 views
0

我有一個屬性表,我有四頁。在第二頁我有一個列表控件和一個按鈕。並在第二頁我創建了兩個線程。當我點擊下一個在第一頁,我試圖使用從網絡中檢索的一些值枚舉列表控件。因此,在這裏,搜索對話框和枚舉列表正在兩個並行運行的不同線程中處理。在頁面的前面,搜索對話框彈出並且後臺從網絡的價值檢索和列表得到枚舉這些值。在那個時候,如果我點擊客戶區,那麼這個搜索對話框正在最小化。但這應該不會發生,除非搜索對話框被解僱,我不能給予對父窗口的訪問(與ModalDiaolg框相同的場景,正如我們所知道的,除非子窗口關閉,否則我們將無法訪問父權,同樣的場景是必需的)f或我)。這是我爲了讓這些線程一次運行而完成的代碼。如何使用多線程鎖定資源?

BOOL CModelSelectionView::CreateModelThread() 
     { 
       unsigned threadID; 

      if(NULL == (m_hModelThread = (HANDLE)_beginthreadex(
         NULL, 
         0, 
         &CModelSelectionView::ModelThreadProc, 
         reinterpret_cast<void*>(this), 
         0, 
         &threadID))) 
     { 
       return FALSE; 
     } 



     return TRUE; 
    } 

//這個線程是搜索對話框

UINT CModelSelectionView::ModelThreadProc(void* lpContext) 
    { 
    CModelSelectionView *pSelectModelFromList = 
     reinterpret_cast<CModelSelectionView*> (lpContext);` 
     AfxSetResourceHandle(theApp.m_hDialogResource); 

     CSearchingView SearchView(IDD_DIALOG_SEARCH); 

    INT nRes = SearchView.DoModal(); 
    ::CloseHandle(pSelectModelFromList->m_hModelThread); 
    pSelectModelFromList->m_hModelThread = NULL; 

    _endthreadex(0); 



return TRUE; 
} 

BOOL CModelSelectionView::CreateInstallerThread() 
{ 
    unsigned threadID; 
if(NULL == (m_hInstallerThread = (HANDLE)_beginthreadex(
    NULL, 
    0, 
    &CModelSelectionView::InstallerThreadProc, 
    reinterpret_cast<void*>(this), 
    0, 
    &threadID))) 
{ 
    return FALSE; 
} 

return TRUE; 
} 

用於初始化一些值

UINT CModelSelectionView::InstallerThreadProc(void* lpContext) 
{ 
    CModelSelectionView *pSelectModelFromList = 
    reinterpret_cast<CModelSelectionView*> (lpContext); 
    pSelectModelFromList->m_listCtrl.DeleteAllItems(); 

    LVITEM lvitem; 
    lvitem.mask = LVIF_TEXT; 
    lvitem.iItem = 0; 
    lvitem.iSubItem = 0; 
    lvitem.pszText = L""; 
    lvitem.cchTextMax = sizeof(lvitem.pszText); 
    int nItem = pSelectModelFromList->m_listCtrl.InsertItem(&lvitem); 
    ::Sleep(200); 

    pSelectModelFromList->m_listCtrl.SetItemText(0,1,L"XXX"); 
    pSelectModelFromList->m_listCtrl.SetItemText(0,2,L"YYY"); 
    pSelectModelFromList->m_listCtrl.SetItemText(0,3,L"ZZZ"); 
    pSelectModelFromList->m_listCtrl.SetItemText(0,4,L"AAAA"); 


::Sleep(200); 



::TerminateThread(pSelectModelFromList->m_hModelThread, 0); 
    ::CloseHandle(pSelectModelFromList->m_hModelThread); 
    pSelectModelFromList->m_hModelThread = NULL; 

    ::CloseHandle(pSelectModelFromList->m_hInstallerThread); 
    pSelectModelFromList->m_hInstallerThread = NULL; 

    _endthreadex(0); 

    return TRUE; 
} 

清單//第二個線程,直到除非搜索對話框關閉它不應該被允許訪問父窗口。例如,當點擊一個按鈕,併爲那個按鈕處理程序,我打電話domodal然後彈出一個子對話框,直到除非我們忽略那個對話框我們w生病不允許訪問父母的權利,同樣我必須得到在這種情況下。

任何人都可以建議我怎麼做到這一點。

任何人都可以請建議我如何

回答

0

只需EnableWindow(FALSE)爲不應該接受任何輸入窗口。它仍將被顯示並且其內容被更新,但鼠標和鍵盤事件不會到達該窗口。