我有一个 std::thread
对象,我想发送线程 ID,即 std::thread::id
到 PostThreadMessageA它得到一个 DWORD
一个 unsigned long
的 typedef
。我如何发送线程 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
向该线程发送消息之前至少调用函数 GetMessage
或 PeekMessage
一次。查看official Microsoft documentation on this function了解更多信息。
关于c++ - 如何将thread::id 发送给PostThreadMessage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60626006/