6

Mam aplikację MFC, która ma wątek roboczy, chcę wysłać wiadomość z wątku roboczego do głównego wątku GUI, aby zaktualizować niektóre komunikaty o stanie w interfejsie GUI. Co mam zrobić tak daleko jest Registered a new window messagePostMessage z WorkerThread do głównego okna w MFC

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

Dodany tę wiadomość na mapie komunikatów klasy dialogowym

ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate) 

Prototyp OnStatusUpdate jest

afx_msg LRESULT OnStatusUpdate(WPARAM, LPARAM); 

i definicja jest

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

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

i oznaczeniem gwintu pracownik nazywając to

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

    AfxBeginThread(FTPConnectThread,&params); 
} 

i kod gwint Pracownik jest

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

problem jest wtedy, gdy funkcja PostMessage jest nazywany OnStatusUpdate powinien być nazywany, ale nie jest on nazywany, nie jest zgłaszany wyjątek ani asercja, co robię źle? Próbowałem ON_REGISTERED_MESSAGE i ON_MESSAGE, ale bez powodzenia, jakiejkolwiek pomocy?

Odpowiedz

5

CMFC_TestApplicationDlg::OnBnClickedMfcbutton1() może powrócić przed rozpoczęciem wątku. Powoduje to, że Twój telefon ThreadParams wychodzi poza zasięg, więc kiedy uzyskujesz dostęp do niego z wątku, uzyskujesz dostęp do zwolnionej pamięci. Trzeba przeznaczyć go w inny sposób, na przykład:

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

Dzięki wielkie za pomoc, Twój kod z niewielką zmianą pracowali, ona pracowała kiedy użyłem go z 'ON_REGISTERED_MESSAGE' –

Powiązane problemy