gpt4 book ai didi

c++ - 如何处理 std::thread 中的 PostMessage 线程消息?

转载 作者:行者123 更新时间:2023-12-05 01:49:59 27 4
gpt4 key购买 nike

在我的主线程的某处,我正在调用PostThreadMessage()。但是我不知道如何在我发送到的 std::thread 中处理它。

我试图在 std::thread 中像这样处理它:

while(true) {
if(GetMessage(&msg, NULL, 0, 0)) {
// Doing appropriate stuff after receiving the message.
}
}

我从主线程发送消息是这样的:

PostThreadMessage(thread.native_handle(), WM_CUSTOM_MESSAGE, 0, 0);

我不知道我是否应该像在我的线程中那样收到消息。

我只想知道,如何检查“工作线程”是否收到我发送的消息。

最佳答案

std::thread::native_handle() 返回的是实现定义的(根据 C++ 标准中的 [thread.req.native])。甚至无法保证它会返回 PostThreadMessage() 想要的线程 ID

例如,MSVC 的 std::thread 实现在内部使用了 CreateThread(),其中 native_handle() 返回一个 Win32 句柄。您必须使用 GetThreadId() 从该句柄中获取线程 ID。

std::thread 的其他实现可能根本不使用 CreateThread()。例如,他们可以改用 pthreads 库,其中 native_handle() 会返回一个 pthread_t 句柄,这与 Win32 API 不兼容。

解决此问题的更安全方法是根本不使用 native_handle()。在您的线程函数内部调用 GetCurrentThreadId(),将结果保存到一个变量中,然后您可以在需要时将其与 PostThreadMessage() 一起使用,例如:

struct threadInfo
{
DWORD id;
std::condition_variable hasId;
};

void threadFunc(threadInfo &info)
{
info.id = GetCurrentThreadId();
info.hasId.notify_one();

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
// Doing appropriate stuff after receiving the message.
}
}

...

threadInfo info;
std::thread t(threadFunc, std::ref(info));
info.hasId.wait();
...
PostThreadMessage(info.id, WM_CUSTOM_MESSAGE, 0, 0);

关于c++ - 如何处理 std::thread 中的 PostMessage 线程消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73560455/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com