Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将thread::id发送到PostThreadMessageA?_C++_Windows_Multithreading_Visual C++ - Fatal编程技术网

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
a
typedef
无符号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:谢谢,我已经相应地重新制定了答案。