Цель данного шага научиться обрабатывать сообщения, которые может посылать поток. Меняйте предыдущий шаг. Сначала сообщение нужно объявить. Свое сообщение, пользовательское. Все это мы делаем в файле TestThreadDlg.cpp, если не забыли.
...... #endif const WM_USERMSG=WM_USER+100; ///////////////////////////////////////// // CAboutDlg dialog used for App About ......
Есть. Теперь нужно создать функцию, которая будет вызываться при появлении этого сообщения.
...... /////////////////////////// // CTestThreadDlg dialog class CTestThreadDlg : public CDialog { // Construction public: void Mess(); CTestThreadDlg(CWnd* pParent = NULL); // standard constructor ......
Описать реакции на сообщение:
BEGIN_MESSAGE_MAP(CTestThreadDlg, CDialog) //{{AFX_MSG_MAP(CTestThreadDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON2, OnStart) ON_BN_CLICKED(IDC_BUTTON1, OnStop) //}}AFX_MSG_MAP ON_MESSAGE(WM_USERMSG,Mess) END_MESSAGE_MAP()
И реализацию самой функции:
void CTestThreadDlg::Mess() { AfxMessageBox("Thread Message"); }
Для того, чтобы поток мог передать сообщение ему нужно знать HWND. Вот и передадим ее в параметрах.
void CTestThreadDlg::OnStart() { // TODO: Add your control notification handler code here HWND hWnd=GetSafeHwnd(); AfxBeginThread(Threads,hWnd); }
Сам поток через некоторое время будет посылать сообщение:
UINT Threads(LPVOID pParam) { Sleep(10000); ::PostMessage(HWND(pParam),WM_USERMSG,0,0); return 0; }
Вот и все. Можно запускать и тестировать. Нажимаете на Start, через некоторое время появится окно говорящее о том, что от потока получено сообщение.