创建win32窗口需要注册,回调函数一些操作,如果我们不需要窗口的话,可以使用下面代码获得一个仅有消息循环的控制台。
ps: 这样做主要对一些不需要窗口但需要消息循环的程序特别有用,比如蓝牙回调。
#include <Windows.h> #include <thread> #include <iostream> using namespace std; DWORD threadID{}; void ThreadFunction(HANDLE event_handle) { MSG msg; BOOL result; threadID = GetCurrentThreadId(); SetEvent(event_handle); for (;;) { result = GetMessage(&msg, nullptr, 0, 0); if (result <= 0) { break; } cout << msg.message << " " << msg.wParam << " " << msg.lParam << endl; } } int main() { HANDLE e = CreateEvent(nullptr, FALSE, FALSE, nullptr); thread t(ThreadFunction, e); WaitForSingleObject(e, INFINITE); CloseHandle(e); PostThreadMessage(threadID, WM_APP + 1, 1, 2); PostThreadMessage(threadID, WM_APP + 2, 10, 20); PostThreadMessage(threadID, WM_QUIT, 10, 20); t.join(); return 0; }
拓展:
windows应用程序中的一个常见架构是有一个主UI线程(通常这是主线程),它创建并拥有所有UI,并有一个消息循环,为线程创建的所有UI发送消息。如果一个应用程序需要做一些可能会阻止的事情,比如从套接字读取数据,那么通常会使用一个工作线程来实现这个目的:你不希望UI线程阻止(例如,在等待套接字的输入时),因为在这段时间内它不会处理输入,UI最终会没有响应。
如果你有多个UI要同时处理它们的消息的话,那么主线程的消息循环明显不够用,容易造成堵塞。 那么我们就可以编写一个包含多个UI线程的应用程序——每个创建windows的线程都需要自己的消息循环——但这是一种相当先进的技术,对于大多数基本的应用程序来说并不是那么有用。