首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenThread()返回空Win32

OpenThread()返回空Win32
EN

Stack Overflow用户
提问于 2009-07-01 15:35:39
回答 2查看 6.9K关注 0票数 2

我觉得这个问题有一个显而易见的答案,但我一直回避这个问题。我在这里的C++中有一些遗留代码,当它试图调用OpenThread()时会中断。我正在Visual C++ 2008速成版中运行它。程序首先获取调用线程的ThreadID,并尝试打开它,如下所示:

ThreadId threadId = IsThreaded()?thread_id :GetCurrentThreadId();

HANDLE threadHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,threadId);

现在我不明白的是:如果线程ID是当前线程的ID,那么它不是已经打开了吗?这可能是它返回NULL的原因吗?

任何反馈都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 6
EN

Stack Overflow用户

发布于 2009-12-15 06:54:35

尝试使用_beginthreadex而不是OpenThread。示例:

代码语言:javascript
复制
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;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1069860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档