6

Ich habe eine MFC-Anwendung, die einen Arbeitsthread hat, was ich tun möchte, ist Nachricht von Worker-Thread an den GUI-Hauptthread zu aktualisieren einige Statusmeldungen auf GUI. Was ich bisher getan ist Registered a new window messagePostMessage von WorkerThread zum Hauptfenster in MFC

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

hinzugefügt Diese Nachricht auf die Nachricht Karte von Dialogklasse

ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate) 

Der Prototyp OnStatusUpdate ist

afx_msg LRESULT OnStatusUpdate(WPARAM, LPARAM); 

und Definition ist

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

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

und der Arbeiter-Thread ruft Code ist

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

    AfxBeginThread(FTPConnectThread,&params); 
} 

und Worker-Thread-Code ist

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

das Problem ist, wenn die Postmessage Funktion der OnStatusUpdate genannt wird aufgerufen werden soll, aber es wird nicht aufgerufen wird, keine Ausnahme oder Behauptung wird geworfen, Was mache ich falsch? Ich habe versucht ON_REGISTERED_MESSAGE und ON_MESSAGE aber keinen Erfolg, keine Hilfe?

Antwort

5

CMFC_TestApplicationDlg::OnBnClickedMfcbutton1() möglicherweise zurück, bevor der Thread startet. Das führt dazu, dass Ihr ThreadParams den Gültigkeitsbereich überschreitet. Wenn Sie also über den Thread darauf zugreifen, greifen Sie auf den freigegebenen Arbeitsspeicher zu. Sie müssen es auf eine andere Weise verteilen, wie zum Beispiel:

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

Vielen Dank für Ihre Hilfe, Ihr Code mit einer geringfügigen Änderung gearbeitet, es funktionierte, als ich es verwendet mit 'ON_REGISTERED_MESSAGE' –

Verwandte Themen