6

У меня есть приложение MFC, в котором есть рабочий поток, что я хочу сделать, это отправить сообщение из рабочего потока в поток основного GUI, чтобы обновить некоторые сообщения о статусе в графическом интерфейсе. То, что я сделал до сих пор является Registered a new window messagePostMessage from WorkerThread to Main Window в MFC

//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,&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); 
    //PostMessage do nothing? what I am doing wrong? 
    return 1; 
} 

проблема, когда функция PostMessage называется OnStatusUpdate следует назвать, но это не вызывается, Никакое исключение или утверждение не бросается, что я делаю неправильно? Я пробовал ON_REGISTERED_MESSAGE и ON_MESSAGE, но никакого успеха, никакой помощи?

ответ

5

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; 
} 
+1

Большое спасибо за вашу помощь, ваш код с незначительным изменением работал, он работал, когда я использовал его с 'ON_REGISTERED_MESSAGE' –

 Смежные вопросы

  • Нет связанных вопросов^_^