PostMessage aus WorkerThread zu Main-Fenster in MFC
Ich habe eine MFC-Anwendung, die ein worker-thread, was ich will zu tun ist, um post-Meldung aus worker-thread auf die GUI-thread zu aktualisieren, einige status-Meldungen auf der GUI. Was ich bisher getan habe ist Registered a new window message
//custom messages
static UINT FTP_APP_STATUS_UPDATE = ::RegisterWindowMessageA("FTP_APP_STATUS_UPDATE");
Hinzugefügt, die diese Nachricht an die message-map der dialog-Klasse
ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate)
Den 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 die worker-thread-Aufruf-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,¶ms);
}
- 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 aufgerufen, die OnStatusUpdate
genannt werden sollte, aber es wird nicht aufgerufen, keine Ausnahme oder assertion geworfen wird, Was mache ich falsch? Ich habe versucht ON_REGISTERED_MESSAGE
und ON_MESSAGE
aber keinen Erfolg, keine Hilfe?
InformationsquelleAutor Muhammad Ummar | 2012-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
CMFC_TestApplicationDlg::OnBnClickedMfcbutton1()
möglicherweise zurück, bevor der thread gestartet wird. Dies bewirkt, dass IhrThreadParams
zu gehen, außerhalb des Bereichs, so dass beim Zugriff aus dem thread, Sie sind Zugriff auf freigegebenen Speicher. Sie zuteilen müssen Sie es einen anderen Weg, wie zum Beispiel:ON_REGISTERED_MESSAGE
InformationsquelleAutor Dark Falcon