【问题标题】:How to send thread::id to PostThreadMessageA?如何将 thread::id 发送到 PostThreadMessage?
【发布时间】:2020-06-22 20:17:18
【问题描述】:

我有一个 std::thread 对象,我想将线程 id(std::thread::id)发送到 PostThreadMessageA,得到 DWORDtypedefunsigned long。如何发送线程 id?

【问题讨论】:

  • 你需要GetThreadId((HANDLE)t.native_handle)

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


【解决方案1】:

一般可以调用函数std::thread::native_handle获取实现定义的原生句柄类型,调用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,函数返回一个原生的Win32 HANDLE。这意味着您可以将此 HANDLE 传递给本机 Win32 API 函数。因此,您可以将这样的HANDLE 传递给Win32 API 函数GetThreadId,该函数将线程ID 作为DWORD 返回。然后可以将此返回值传递给函数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

【讨论】:

  • "如果线程是通过 std::thread API 创建的,则不太可能创建这样的消息队列。" - 如果设计正确,则不太可能。如果目标线程至少调用了一次 GetMessage 或 PeekMessage,则它有一个队列。
  • @selbie:谢谢,我已经相应地重新制定了我的答案。
猜你喜欢
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2022-07-22
  • 2013-03-01
  • 2023-04-02
  • 2013-10-04
  • 2014-01-01
  • 1970-01-01
相关资源
最近更新 更多