Шаг 340 - Сообщения от потоков окну

Цель данного шага научиться обрабатывать сообщения, которые может посылать поток. Меняйте предыдущий шаг. Сначала сообщение нужно объявить. Свое сообщение, пользовательское. Все это мы делаем в файле 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, через некоторое время появится окно говорящее о том, что от потока получено сообщение.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 10.05.2001