6

में वर्कर थ्रेड से मुख्य विंडो में पोस्टमेसेज मेरे पास एक एमएफसी एप्लीकेशन है, जिसमें एक वर्कर थ्रेड है, जो मैं करना चाहता हूं वह है कि कार्यकर्ता थ्रेड से मुख्य जीयूआई थ्रेड में संदेश पोस्ट करने के लिए जीयूआई पर कुछ स्टेटस संदेश अपडेट करें। क्या मैं अब तक क्या किया है Registered a new window messageएमएफसी

//custom messages 
static UINT FTP_APP_STATUS_UPDATE = ::RegisterWindowMessageA("FTP_APP_STATUS_UPDATE"); 

संवाद वर्ग के संदेश नक्शा

ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate) 

OnStatusUpdate के प्रोटोटाइप

afx_msg LRESULT OnStatusUpdate(WPARAM, LPARAM); 

है को यह संदेश है जोड़ा और परिभाषा

है
LRESULT CMFC_TestApplicationDlg::OnStatusUpdate(WPARAM wParam, LPARAM lParam) 
{ 

    //This function is not called at all. 
    return 0; 
} 

और कार्यकर्ता धागा बुला कोड

void CMFC_TestApplicationDlg::OnBnClickedMfcbutton1() 
{ 
    ThreadParams params; 
    params.m_hWnd = m_hWnd; 
    params.FTPHost = "test_host"; 
    params.FTPUsername = "test"; 
    params.FTPPassword = "test"; 

    AfxBeginThread(FTPConnectThread,&params); 
} 

है और कार्यकर्ता धागा कोड

//child thread function 
UINT FTPConnectThread(LPVOID pParam) 
{ 
    if(pParam == NULL) 
    { 
     return 0; 
    } 
    ThreadParams *params = (ThreadParams*)pParam; 
    OutputDebugString(params->FTPHost); 
    Sleep(4000); //simulating a network call 
    CString * message = new CString("Conencted"); 
    PostMessage(params->m_hWnd,FTP_APP_STATUS_UPDATE,0,(LPARAM)message); 
    //PostMessage do nothing? what I am doing wrong? 
    return 1; 
} 

जब PostMessage समारोह OnStatusUpdate बुलाया जाना चाहिए कहा जाता है समस्या यह है है, लेकिन यह नहीं कहा जा रहा है, कोई अपवाद या दावा फेंक दिया गया है, मैं क्या गलत कर रहा हूँ? मैंने ON_REGISTERED_MESSAGE और ON_MESSAGE की कोशिश की है लेकिन कोई सफलता नहीं, कोई मदद?

उत्तर

5

CMFC_TestApplicationDlg::OnBnClickedMfcbutton1() थ्रेड शुरू होने से पहले वापस आ सकता है। यह आपके ThreadParams को दायरे से बाहर जाने का कारण बनता है, इसलिए जब आप इसे थ्रेड से एक्सेस करते हैं, तो आप मुक्त स्मृति तक पहुंच सकते हैं। आप इसे इस तरह के रूप किसी अन्य तरीके से आवंटित करने के लिए, की जरूरत है:

void CMFC_TestApplicationDlg::OnBnClickedMfcbutton1() 
{ 
    ThreadParams* params = new ThreadParams(); 
    params->m_hWnd = m_hWnd; 
    params->FTPHost = "test_host"; 
    params->FTPUsername = "test"; 
    params->FTPPassword = "test"; 

    AfxBeginThread(FTPConnectThread,params); 
} 

//child thread function 
UINT FTPConnectThread(LPVOID pParam) 
{ 
    if(pParam == NULL) 
    { 
     return 0; 
    } 

    ThreadParams *params = (ThreadParams*)pParam; 
    OutputDebugString(params->FTPHost); 
    Sleep(4000); //simulating a network call 
    CString * message = new CString("Conencted"); 
    PostMessage(params->m_hWnd,FTP_APP_STATUS_UPDATE,0,(LPARAM)message); 

    delete params; 
    return 1; 
} 
+1

धन्यवाद आपकी मदद के लिए एक बहुत, एक मामूली परिवर्तन के साथ अपने कोड काम किया, यह काम किया जब मैं 'ON_REGISTERED_MESSAGE' साथ यह प्रयोग किया जाता –

संबंधित मुद्दे