GUI程序中使用windows消息实现并行

一个消息循环做的并行类。

class ClsA
{
public:
	ClsA();
	LRESULT HandleMessage(HWND, UINT, WPARAM, LPARAM);

	void Method1();

public:
	static LPCTSTR WindowClass;
	static ATOM RegisterWndClass(HINSTANCE hInst);

public:
	static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
	HWND m_hWnd;
	UINT32 m_val;
};

ClsA::ClsA()
{
	// 创建一个MessageOnly窗口
	m_hWnd = CreateWindow(WindowClass, NULL, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, HWND_MESSAGE, NULL, NULL, (LPVOID)this);
	m_val = 0;
}

void ClsA::Method1()
{
	ATLTRACE(_T("%u\n"), m_val);
	++m_val;
}

LRESULT ClsA::HandleMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) 
	{
	case WM_APP + 1:
		Method1();
		break;
	default:
		return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}

LPCTSTR ClsA::WindowClass = _T("ClsAWindowClass");
ATOM ClsA::RegisterWndClass(HINSTANCE hInst)
{
	WNDCLASSEX wcex = { 0 };

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = ClsA::WndProc;
	wcex.hInstance = hInst;
	wcex.lpszClassName = ClsA::WindowClass;

	return RegisterClassEx(&wcex);
}
LRESULT CALLBACK ClsA::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_CREATE:
	{
		LPCREATESTRUCT lpCS = (LPCREATESTRUCT)lParam;
		SetWindowLong(hWnd, GWL_USERDATA, (LONG)lpCS->lpCreateParams);
		break;
	}
	default:
		ClsA* lpObj = (ClsA*)GetWindowLong(hWnd, GWL_USERDATA);
		if (nullptr != lpObj) {
			return lpObj->HandleMessage(hWnd, uMsg, wParam, lParam);
		}
		return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
测试代码:

DWORD WINAPI ThreadProc(_In_  LPVOID lpParameter)
{
	HWND hWnd = (HWND)lpParameter;
	for (size_t i = 0; i < 1000; i++) {
		::SendMessage(hWnd, WM_APP + 1, NULL, NULL);
	}
	return 0;
}

// 主线程逻辑
	ClsA::RegisterWndClass(hInstance);
	ClsA a;
	CreateThread(nullptr, 0, ThreadProc, a.m_hWnd, 0, nullptr);
	CreateThread(nullptr, 0, ThreadProc, a.m_hWnd, 0, nullptr);
	// 主消息循环: 
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值