6

Tengo una aplicación MFC, que tiene un subproceso de trabajo, lo que quiero hacer es publicar un mensaje desde el subproceso de trabajo al subproceso de GUI principal para actualizar algunos mensajes de estado en la GUI. Lo que he hecho hasta ahora es Registered a new window messagePostMessage desde WorkerThread a la ventana principal en MFC

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

añadido este mensaje al mapa de mensajes de la clase de diálogo

ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate) 

El prototipo de OnStatusUpdate es

afx_msg LRESULT OnStatusUpdate(WPARAM, LPARAM); 

y definición es

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

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

y el código de subproceso de trabajo llamando es

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

    AfxBeginThread(FTPConnectThread,&params); 
} 

y el código de hilo trabajador es

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

el problema es cuando la función PostMessage se llama el OnStatusUpdate debería ser llamado, pero no se está llamando, ninguna excepción o afirmación es arrojada, ¿Qué estoy haciendo mal? He intentado ON_REGISTERED_MESSAGE y ON_MESSAGE pero sin éxito, ¿alguna ayuda?

Respuesta

5

CMFC_TestApplicationDlg::OnBnClickedMfcbutton1() pueden regresar antes de que comience el hilo. Esto hace que su ThreadParams salga del alcance, de modo que cuando acceda desde la secuencia, esté accediendo a la memoria liberada. Es necesario asignar alguna otra forma, como por ejemplo:

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

Muchas gracias por su ayuda, su código con un cambio menor funcionó, funcionó cuando lo usé con 'ON_REGISTERED_MESSAGE' –

Cuestiones relacionadas