C++ 如何将thread::id发送到PostThreadMessageA?
我有一个C++ 如何将thread::id发送到PostThreadMessageA?,c++,windows,multithreading,visual-c++,C++,Windows,Multithreading,Visual C++,我有一个std::thread对象,我想发送线程id,它是std::thread::id,向它获取DWORDatypedef的无符号long。如何发送线程id?通常,您可以调用函数来获取实现定义的本机句柄类型和线程id 由于您提到的函数需要线程ID而不是“句柄”,乍一看,使用函数std::thread::get_ID而不是std::thread::native_handle似乎很有意义。但是,根据,函数返回类型为class thread::id的对象,而不是DWORD,但函数PostThread
std::thread
对象,我想发送线程id,它是std::thread::id
,向它获取DWORD
atypedef
的无符号long
。如何发送线程id?通常,您可以调用函数来获取实现定义的本机句柄类型和线程id
由于您提到的函数需要线程ID而不是“句柄”,乍一看,使用函数std::thread::get_ID
而不是std::thread::native_handle
似乎很有意义。但是,根据,函数返回类型为class thread::id
的对象,而不是DWORD
,但函数PostThreadMessage
需要线程id为DWORD
。函数未提供将此类转换为DWORD
的任何文档化方法
虽然可以通过某种未记录的黑客将类线程::id
转换为DWORD
,但我建议您使用以下记录的方法:
根据,该函数返回本机Win32句柄
。这意味着您可以将此句柄
传递给本机Win32 API函数。因此,您可以将这样一个句柄
传递给Win32 API函数,该函数将线程ID作为DWORD
返回。然后可以将此返回值传递给函数PostThreadMessage
因此,要从类型为std::thread
的对象中将线程ID提取为DWORD
,可以使用以下代码行:
DWORD dwThreadId=GetThreadId(my_thread_object.native_handle())代码>
请注意,函数PostThreadMessage
要求目标线程已创建消息队列,否则函数调用将失败。如果线程是通过std::thread
API创建的,则可能没有创建这样的消息队列。因此,在使用PostThreadMessage
向该线程发送消息之前,应确保目标线程至少调用函数GetMessage
或PeekMessage
。有关更多信息,请参阅。您需要GetThreadId((HANDLE)t.native_HANDLE)“如果线程是通过std::thread API创建的,则不太可能创建这样的消息队列。”-如果设计正确,也不太可能。如果目标线程至少调用过一次GetMessage或PeekMessage,则它有一个队列。@selbie:谢谢,我已经相应地重新制定了答案。