2014-02-20 36 views
0

我意識到MFC GUI控件不能直接從工作線程訪問,但例如,他們通過傳遞給此線程指向擁有該控件的對象實例的指針。我的問題是,當我調用需要訪問MFC控件的工作線程範圍內的函數時,我非常確定它是如何進行的。請考慮以下代碼:工作線程和MFC控件

//header: 
class CMyDlg : public CDialog 
{ 
    ... 
    ... 
    ... 
    afx_msg void OnButtonControl(); 
    static UNIT ControlThread(LPVOID pParam); 
    bool ValidateEditControl(); 
} 

//cpp 
void CMyDlg::OnButtonControl() 
    { 
     CString Text = "Hello"; 
     GetDlgItem(IDC_EDIT_HELLO)->SetWindowText(Text); 
     m_hControlThread = AxtBeginThread(ControlThread, this); 

    } 

    UINT CMyDlg::ControlThread(LPVOID pParam) 
    { 
     CMyDlg *dlg = (CMyDlg*) pParam; 
     CString Text = "Hello"; 
     while(SomethingIsTrue) { 
     bool Ret = dlg->ValidateEditControl(); 
     if (!Ret) //Someone changed ControlEntry -> change it back 
      dlg->GetDlgItem(IDC_EDIT_HELLO)->SetWindowText(Text); 
     } 
     AfxEndThread(0); 
    } 

    bool CMyDlg::ValidateEditControl() 
    { 
     CString Text; 
     this->GetDlgItem(IDC_EDIT_HELLO)->GetWindowText(Text); // do I need the "this" pointer here, or for general how do I access my MFC control at this point? 
     if (Text == "Hello") 
     return true; 
     else 
     return false; 
    } 

這是什麼最好的辦法?

預先感謝您 最好格雷格

+0

你的代碼不會編譯。第一個原因是ControlThread函數必須聲明爲靜態。糾正這將導致其他錯誤,所以你的問題的前提是關閉的。 –

+0

如果'ControlThread'被聲明爲static,那麼你還需要將'ValidateEditControl()'改成'dlg-> ValidateEditControl()'和'this-> GetDlgItem(IDC_EDIT_HELLO)'到'GetDlgItem(IDC_EDIT_HELLO)',因爲'ValidateEditControl'是一個成員函數,因此'this'已經暗示。這聽起來好像在整個靜態和成員問題上存在一些混淆...... – user1793036

+0

謝謝你的回答,我對不完整性表示歉意。剛剛編輯我的帖子。 – GregPhil

回答

-1

沒有考慮太多的細節,這裏是你應該怎麼做。我沒有建立,判斷或修改你的基本代碼,我只是解決了你的線程部分問題。你應該可以從這裏拿走它。

UINT CMyDlg::ControlThread(LPVOID pParam) 
{ 
    HWND hWnd = (HWND) pParam; 
    CString Text = "Hello"; 
    while(SomethingIsTrue) { 
    bool Ret = SendMessage(HwND, VALIDATE_CONTROL,0,0); 
    if (!Ret) //Someone changed ControlEntry -> change it back 
    SendMessage(CHANGE_EDIT_HELLO, &Text, 0); 
    } 
    AfxEndThread(0); 
} 
-2

我會加入這個作爲一個評論,但不能迴應還:提出的解決方案通過zadane是一樣的原代碼一樣糟糕,並可能導致依賴於你的代碼的其餘部分死鎖,但另外,它並沒有真正解決你的問題,你可能只是在主線程中完成它,因爲它在概念上是在做什麼。

這將有助於如果你能解釋一下爲什麼你需要做在一個線程中的驗證,但也許你可以玩的以下想法:

你能趕上變化事件的編輯控件,我假設你已經在做,然後在超時,變化量或者符合你的驗證標準的情況下,向工作者線程發送一條消息(通過PostMessage和線程安全/同步或分配緩衝區以使數據得到驗證)。驗證數據並將消息發送回窗口到用戶定義的ON_MESSAGE處理程序(同樣,通過PostMessage),讓GUI知道驗證結果。