我觉得有一个明显的答案,但它一直在逃避我。我在C ++中有一些遗留代码在尝试调用OpenThread()时会中断。我在Visual C ++ 2008 Express Edition中运行它。程序首先获取调用线程的ThreadID,并尝试打开它,如下所示:
ThreadId threadId = IsThreaded()? thread_id ::: GetCurrentThreadId();
HANDLE threadHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,threadId);
现在我不明白了:如果线程ID是当前线程的ID,是不是已经打开了?这可能是它返回NULL的原因吗?
任何反馈都将不胜感激。
答案 0 :(得分:6)
也许你要求过多的访问权限(THREAD_ALL_ACCESS
),尽管我认为你对自己的主题拥有几乎所有的权限。尝试减少对真正需要的访问权限。
GetLastError()
返回什么?
更新
看一下来自MSDN的评论:
Windows Server 2003和Windows XP / 2000:大小
THREAD_ALL_ACCESS
标志增加了 Windows Server 2008和Windows Vista。 如果是为Windows编译的应用程序 Server 2008和Windows Vista正在运行 在Windows Server 2003或Windows上 XP / 2000,THREAD_ALL_ACCESS
标志是 太大而且功能指定 这个标志失败了ERROR_ACCESS_DENIED
。为了避免这种情况 问题,请指定最小集合 访问权限 操作。如果必须THREAD_ALL_ACCESS
使用,将_WIN32_WINNT
设置为 目标最低操作系统 你的申请(例如,#define _WIN32_WINNT _WIN32_WINNT_WINXP
)。有关更多信息,请参阅使用Windows 头
答案 1 :(得分:-1)
尝试使用_beginthreadex而不是OpenThread。 例如:
HANDLE hThread;
UINT uiThreadId = 0;
hThread = (HANDLE)_beginthreadex(NULL, // Security attributes
0, // stack
&this->ThreadProc, // Thread proc
this, // Thread param
CREATE_SUSPENDED, // creation mode
&uiThreadId); // Thread ID
if (hThread != NULL){
//SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST);
ResumeThread(hThread);
m_hThread = hThread;
}
else{
eRetVal = err_ThreadStartErr;
}