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

来源:互联网 发布:mac两个窗口并列 编辑:程序博客网 时间:2024/05/23 02:02

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

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);}}

0 0
原创粉丝点击