PostMessage из WorkerThread в главное окно в MFC
У меня есть приложение MFC, в котором есть рабочий поток, и я хочу отправить сообщение из рабочего потока в основной поток графического интерфейса для обновления некоторых сообщений о состоянии в графическом интерфейсе. То, что я сделал до сих пор, Registered a new window message
//custom messages
static UINT FTP_APP_STATUS_UPDATE = ::RegisterWindowMessageA("FTP_APP_STATUS_UPDATE");
Добавил это сообщение в карту сообщений диалогового класса
ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate)
Прототип OnStatusUpdate
является
afx_msg LRESULT OnStatusUpdate(WPARAM, LPARAM);
и определение
LRESULT CMFC_TestApplicationDlg::OnStatusUpdate(WPARAM wParam, LPARAM lParam)
{
//This function is not called at all.
return 0;
}
и рабочий поток, вызывающий код
void CMFC_TestApplicationDlg::OnBnClickedMfcbutton1()
{
ThreadParams params;
params.m_hWnd = m_hWnd;
params.FTPHost = "test_host";
params.FTPUsername = "test";
params.FTPPassword = "test";
AfxBeginThread(FTPConnectThread,¶ms);
}
и код рабочего потока
//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;
}
проблема в том, что когда функция PostMessage называется OnStatusUpdate
должен быть вызван, но он не вызывается, не выбрасывается ни одно исключение или утверждение. Что я делаю не так? я пытался ON_REGISTERED_MESSAGE
а также ON_MESSAGE
но безуспешно, любая помощь?
1 ответ
CMFC_TestApplicationDlg::OnBnClickedMfcbutton1()
может вернуться до начала потока. Это вызывает ваше ThreadParams
выйти из области видимости, поэтому, когда вы обращаетесь к нему из потока, вы получаете доступ к освобожденной памяти. Вы должны выделить его другим способом, например:
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;
}