如何解决从C ++ 11线程获取Win32 API的本机线程句柄
我想在windows.h
上使用std::thread
中的某些Win32 API函数。首先,我正在创建并启动std::thread
。然后,我想通过使用native_handle()
获取句柄在其上使用Win32 API函数。
// suspend_thread.cpp
#include <windows.h>
#include <iostream>
#include <thread>
void foo()
{
unsigned int counter = 1;
while (counter <= 5)
{
// do some work and finish after about 5 seconds
std::cout << "Running... " << counter << "/5" << std::endl;
counter++;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
std::cout << "Done!" << std::endl;
}
int main(void)
{
std::cout << "Starting thread..." << std::endl;
std::thread my_thread(foo);
std::cout << "Waiting 3 seconds..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
DWORD result = SuspendThread((void*) my_thread.native_handle());
if (result != -1) std::cout << "Successfully suspended thread!" << std::endl;
else std::cout << "Failed to suspend thread! Error: " << GetLastError() << std::endl;
my_thread.join();
return 0;
}
如果我不将native_handle()
的结果强制转换为void*
...
DWORD result = SuspendThread(my_thread.native_handle());
...代码无法编译,因为SuspendThread()
需要一个指针。
.\suspend_thread.cpp:25:57: error: invalid conversion from 'std::thread::native_handle_type' {aka 'unsigned int'} to 'HANDLE' {aka 'void*'} [-fpermissive]
现在,如果我编译并运行第一个示例,则会得到以下结果。
PS> g++ -std=c++11 -pthread suspend_thread.cpp -o suspend_thread.exe
PS> ./suspend_thread.exe
Starting thread...
Waiting 3 seconds...
Running... 1/5
Running... 2/5
Running... 3/5
Failed to suspend thread! Error: 6
Running... 4/5
Running... 5/5
Done!
我试图在线程运行时挂起它,但是该函数失败,错误代码为6,根据文档,它代表...
ERROR_INVALID_HANDLE (0x6): The handle is invalid.
...显然,这不是将句柄传递给Win32 API函数的正确方法。
我知道我可以不用Win32 API来以其他方式暂停和恢复线程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。