6

Ho un'applicazione MFC, che ha un thread di lavoro, quello che voglio fare è inviare un messaggio dal thread di lavoro al thread della GUI principale per aggiornare alcuni messaggi di stato sulla GUI. Quello che ho fatto finora è Registered a new window messagePostMessage da WorkerThread alla finestra principale in MFC

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

Aggiunto questo messaggio alla mappa di messaggi di classe finestra

ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate) 

Il prototipo di OnStatusUpdate è

afx_msg LRESULT OnStatusUpdate(WPARAM, LPARAM); 

e definizione è

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

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

e il codice thread di lavoro chiamando è

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

    AfxBeginThread(FTPConnectThread,&params); 
} 

e il codice di filo lavoratore è

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

il problema è quando la funzione PostMessage è chiamato il OnStatusUpdate dovrebbe essere chiamato, ma non viene chiamato, nessuna eccezione o asserzione è stata lanciata, cosa sto facendo male? Ho provato ON_REGISTERED_MESSAGE e ON_MESSAGE ma nessun successo, alcun aiuto?

risposta

5

CMFC_TestApplicationDlg::OnBnClickedMfcbutton1() potrebbe tornare prima che il thread inizi. Questo fa sì che il tuo ThreadParams esca dall'ambito, quindi quando accedi al thread, accedi alla memoria liberata. È necessario allocare qualche altro modo, come ad esempio:

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

Grazie mille per il vostro aiuto, il vostro codice con una piccola modifica lavorato, ha funzionato quando l'ho usato con 'ON_REGISTERED_MESSAGE' –

Problemi correlati