c++ - 如何将thread::id 发送给PostThreadMessage?

标签 c++ windows multithreading visual-c++

我有一个 std::thread 对象,我想发送线程 ID,即 std::thread::idPostThreadMessageA它得到一个 DWORD 一个 unsigned longtypedef。我如何发送线程 ID?

最佳答案

一般可以调用函数std::thread::native_handle获取实现定义的 native 句柄类型和 std::thread::get_id获取线程ID。

自函数PostThreadMessage您提到的需要线程 ID 而不是“句柄”,乍一看,使用函数 std::thread::get_id 而不是 std::thread 似乎很有意义: :native_handle。然而,根据official Microsoft documentation for the function std::thread::get_id ,该函数返回类型为 class thread::id 的对象而不是 DWORD,但是函数 PostThreadMessage 需要一个 DWORD 为线程 ID。 official Microsoft documentation on class thread::id没有提供任何将此类转换为 DWORD 的记录方法。

虽然可以通过某种未记录的 hack 将 class thread::id 转换为 DWORD,但我建议您改用以下记录的方法:

根据official Microsoft documentation on the function std::thread::native_handle , 该函数返回 native Win32 HANDLE。这意味着您可以将此 HANDLE 传递给 native Win32 API 函数。因此,您可以将这样的 HANDLE 传递给 Win32 API 函数 GetThreadId ,它以 DWORD 形式返回线程 ID。然后可以将此返回值传递给函数 PostThreadMessage

因此,要从 std::thread 类型的对象中将线程 ID 提取为 DWORD,您可以使用以下代码行:

DWORD dwThreadId = GetThreadId( my_thread_object.native_handle() );

请注意函数PostThreadMessage要求目标线程已经创建了一个消息队列,否则函数调用将失败。如果线程是通过 std::thread API 创建的,则可能没有创建这样的消息队列。因此,您应该确保目标线程在使用 PostThreadMessage 向该线程发送消息之前至少调用函数 GetMessagePeekMessage 一次。查看official Microsoft documentation on this function了解更多信息。

关于c++ - 如何将thread::id 发送给PostThreadMessage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60626006/

相关文章:

multithreading - pthreads - 如何并行化一个作业

java - 使用 MultiThreadedHttpConnectionManager 为同一个 httpclient 设置不同的套接字超时

c++ - 需要帮助理解构造函数参数和静态变量

c++ - 使用 Stitcher 的 OpenCV 断言失败

c++ - 给定两种图 block 类型,如何随机生成网格样式的岛屿 map ?

windows - 登录 windows azure sql 数据库时出错

c++ - OpenProcess/ReadProcessMemory/WriteProcessMemory/CloseHandle 等效项

c++ - 从指向派生对象的基类指针访问派生私有(private)成员函数

windows - 如何在 Visual Studio 2019 社区版中打开新的 MonoGame 桌面项目?

java - 更新守护进程中的变量 - Java