问题一:
句柄应该表示的是一个线程,,为什么句柄的值不一样呢?
HANDLE g_hand=NULL;
DWORD WINAPI SecondThreadFunc( void* pArguments )
{
int i=0; g_hand=GetCurrentThread();
DuplicateHandle(GetCurrentProcess(),g_hand,GetCurrentProcess(),
&g_hand,THREAD_SUSPEND_RESUME,FALSE,DUPLICATE_SAME_ACCESS);
while(true)
{
Sleep(100);
cout<<"run time "<<i++<<endl;
}
return 0;
}
int main()
{
HANDLE hThread;
hThread = CreateThread(NULL, 0,SecondThreadFunc, NULL, 0, NULL);
Sleep(1000);
cout<<hThread<<endl;//
cout<<g_hand<<endl;// 两个句柄的值不一样,,不解
cin.get();
return 0;
}问题二:
为什么DuplicateHandle 将线程伪句柄转换成真句柄的时候,,在线程内部可以转换成功,在主线程却不能转换成功呢?
HANDLE g_hand=NULL;
DWORD WINAPI SecondThreadFunc( void* pArguments )
{
int i=0;
g_hand=GetCurrentThread();
/*DuplicateHandle(GetCurrentProcess(),g_hand,GetCurrentProcess(),//这里可以转换成功
&g_hand,THREAD_SUSPEND_RESUME,FALSE,DUPLICATE_SAME_ACCESS);*/
while(true)
{
Sleep(100);
cout<<"run time "<<i++<<endl;
}
return 0;
}
int main()
{
HANDLE hThread;
hThread = CreateThread(NULL, 0,SecondThreadFunc, NULL, 0, NULL);
Sleep(1000);
DuplicateHandle(GetCurrentProcess(),g_hand,GetCurrentProcess(),//这里不能转换成功 后面用这个句柄 也不会暂停线程 不解
&g_hand,THREAD_SUSPEND_RESUME,FALSE,DUPLICATE_SAME_ACCESS);
SuspendThread(g_hand);
cin.get();
return 0;
}
问题三: OpenThread 返回的是 真句柄 还是伪句柄??
句柄应该表示的是一个线程,,为什么句柄的值不一样呢?
HANDLE g_hand=NULL;
DWORD WINAPI SecondThreadFunc( void* pArguments )
{
int i=0; g_hand=GetCurrentThread();
DuplicateHandle(GetCurrentProcess(),g_hand,GetCurrentProcess(),
&g_hand,THREAD_SUSPEND_RESUME,FALSE,DUPLICATE_SAME_ACCESS);
while(true)
{
Sleep(100);
cout<<"run time "<<i++<<endl;
}
return 0;
}
int main()
{
HANDLE hThread;
hThread = CreateThread(NULL, 0,SecondThreadFunc, NULL, 0, NULL);
Sleep(1000);
cout<<hThread<<endl;//
cout<<g_hand<<endl;// 两个句柄的值不一样,,不解
cin.get();
return 0;
}问题二:
为什么DuplicateHandle 将线程伪句柄转换成真句柄的时候,,在线程内部可以转换成功,在主线程却不能转换成功呢?
HANDLE g_hand=NULL;
DWORD WINAPI SecondThreadFunc( void* pArguments )
{
int i=0;
g_hand=GetCurrentThread();
/*DuplicateHandle(GetCurrentProcess(),g_hand,GetCurrentProcess(),//这里可以转换成功
&g_hand,THREAD_SUSPEND_RESUME,FALSE,DUPLICATE_SAME_ACCESS);*/
while(true)
{
Sleep(100);
cout<<"run time "<<i++<<endl;
}
return 0;
}
int main()
{
HANDLE hThread;
hThread = CreateThread(NULL, 0,SecondThreadFunc, NULL, 0, NULL);
Sleep(1000);
DuplicateHandle(GetCurrentProcess(),g_hand,GetCurrentProcess(),//这里不能转换成功 后面用这个句柄 也不会暂停线程 不解
&g_hand,THREAD_SUSPEND_RESUME,FALSE,DUPLICATE_SAME_ACCESS);
SuspendThread(g_hand);
cin.get();
return 0;
}
问题三: OpenThread 返回的是 真句柄 还是伪句柄??
解决方案 »
- 如何对一条曲线进行跟踪(两条曲线交叉情况下)?
- 谁能解释下SetDlgItemInt函数的用法?
- 一个关于对话框不能创建的问题
- 关于日历小程序的一个问题?
- 如何将十六进制的显示转换为字符串?如将十六进制显示的0A,转换为字符串:“0A”
- 在浏览器中,如何得到当前光标所在位置的图片的链接地址
- 怎样把工程的debug版本换成release版本来编译?急急急急急急
- 十分棘手,恳请各位帮忙.小弟先谢了.
- 如何在mainframe中获得CView的新建或者关闭信息?
- 哪里有bound checker下?
- 求VC++图像处理程序设计(第2版)电子版
- vc6轮询mysql,检查信息过期,使用系统线程池,可慢,求高人指点
2. 你主线里g_hand有值吗?就是定义的时候初始化为NULL了。
3. 把下面的代码加到你的主线程中你看可以结束子线程吗?
HANDLE handle = OpenThread(THREAD_ALL_ACCESS, FALSE, GetThreadId(hThread));
TerminateThread(handle, 0);
CloseHandle(handle);
将伪句柄装成真句柄,并不说明它就和线程第一次创建时的句柄值是一样的
DuplicateHandle是复制,不是直接转换2.貌似GetCurrentThread()只是返回0xFFFFFFFF,固定值,所以...3.OpenThread真句柄,伪句柄只能用于本线程
GetCurrentProcess() 0xFFFFFFFF
GetCurrentThread() 0xFFFFFFFE
cout<<g_hand<<endl;// 两个句柄的值不一样,,不解
===============‘
DuplicateHandle是复制句柄,所以不一样很正常。为什么DuplicateHandle 将线程伪句柄转换成真句柄的时候,,在线程内部可以转换成功,在主线程却不能转换成功呢?
============
不关DuplicateHandle的事,而是g_hand=GetCurrentThread();得到的是伪句柄,MSDN上面有一句说明:
The function cannot be used by one thread to create a handle that can be used by other threads to refer to the first thread.
这说明伪句柄只能在当前线程中用,出了这个线程就无效了。问题三: OpenThread 返回的是 真句柄 还是伪句柄??
这个返回的是真句柄。