我觉得这个问题有一个显而易见的答案,但我一直回避这个问题。我在这里的C++中有一些遗留代码,当它试图调用OpenThread()时会中断。我正在Visual C++ 2008速成版中运行它。程序首先获取调用线程的ThreadID,并尝试打开它,如下所示:
ThreadId threadId = IsThreaded()?thread_id :GetCurrentThreadId();
HANDLE threadHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,threadId);
现在我不明白的是:如果线程ID是当前线程的ID,那么它不是已经打开了吗?这可能是它返回NULL的原因吗?
任何反馈都将不胜感激。
发布于 2009-07-01 15:39:37
也许您要求过多的访问权限(THREAD_ALL_ACCESS),尽管我认为您对自己的线程拥有几乎所有的权限。尝试减少对你真正需要的东西的访问。
GetLastError()返回什么?
更新:
看看这条来自MSDN的评论:
Windows Server2003和Windows XP/2000:在Windows Server2008和Windows Vista上,
THREAD_ALL_ACCESS标志的大小增加。如果为Windows Server2008和Windows Vista编译的应用程序在Windows Server2003或Windows XP/2000上运行,则THREAD_ALL_ACCESS标志太大,并且指定此标志的函数将因ERROR_ACCESS_DENIED而失败。若要避免此问题,请指定操作所需的最小访问权限集。如果必须使用THREAD_ALL_ACCESS,请将_WIN32_WINNT设置为应用程序所针对的最低操作系统(例如,#define _WIN32_WINNT _WIN32_WINNT_WINXP)。有关详细信息,请参阅使用Windows
发布于 2009-12-15 06:54:35
尝试使用_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;
}https://stackoverflow.com/questions/1069860
复制相似问题