6

Tôi có một ứng dụng MFC, trong đó có một chuỗi công nhân, những gì tôi muốn làm là gửi tin nhắn từ chủ đề công nhân đến chủ đề GUI chính để cập nhật một số thông điệp trạng thái trên GUI. Những gì tôi đã làm cho đến nay là Registered a new window messagePostMessage từ WorkerThread đến cửa sổ chính trong MFC

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

Added thông điệp này đến bản đồ sứ điệp của lớp thoại

ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate) 

Nguyên mẫu của OnStatusUpdate

afx_msg LRESULT OnStatusUpdate(WPARAM, LPARAM); 

và định nghĩa là

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

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

và mã gọi nhân viên chủ đề là

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

    AfxBeginThread(FTPConnectThread,&params); 
} 

và Worker đang đề là

//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; 
} 

vấn đề là khi hàm PostMessage được gọi là OnStatusUpdate nên được gọi, nhưng nó không được gọi là, không có ngoại lệ hoặc khẳng định được ném, những gì tôi đang làm sai? Tôi đã thử ON_REGISTERED_MESSAGEON_MESSAGE nhưng không thành công, bất kỳ trợ giúp nào?

Trả lời

5

CMFC_TestApplicationDlg::OnBnClickedMfcbutton1() có thể trở lại trước khi chuỗi bắt đầu. Điều này gây ra ThreadParams của bạn để đi ra khỏi phạm vi, vì vậy khi bạn truy cập nó từ các chủ đề, bạn đang truy cập bộ nhớ giải phóng. Bạn cần phải phân bổ theo cách khác, chẳng hạn như:

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

Cảm ơn bạn đã giúp đỡ, mã của bạn có thay đổi nhỏ, Đã hoạt động khi tôi sử dụng nó với 'ON_REGISTERED_MESSAGE' –

Các vấn đề liên quan