首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有CWinThread指针数组的WaitForMultipleObjects

具有CWinThread指针数组的WaitForMultipleObjects
EN

Stack Overflow用户
提问于 2012-08-23 19:48:29
回答 1查看 2.1K关注 0票数 0

我有一个通过AfxBeginThread生成线程的循环,它将CWinThread指针存储在一个数组中。在每次迭代中,我检查线程是否为非空,并将线程的句柄存储在另一个数组中。

代码语言:javascript
复制
const unsigned int maxThreads = 2;
CWinThread* threads[maxThreads];
HANDLE* handles[maxThreads];
for(unsigned int threadId=0; threadId < maxThreads; ++threadId)
{
    threads[threadId] = AfxBeginThread(endToEndProc, &threadId,
                                            0,0,CREATE_SUSPENDED);
    if(threads[threadId] == NULL) 
    {
        // die carefully
    }
    threads[threadId]->m_bAutoDelete = FALSE;
    handles[threadId] = &threads[threadId]->m_hThread;
    ::ResumeThread(handles[threadId]);
}

DWORD result = ::WaitForMultipleObjects(maxThreads, handles[0], 
                                            TRUE, 20000*maxThreads);

但是WaitForMultipleObjects总是返回WAIT_FAILED,对于无效的句柄,GetLastError会生成6。要么是对AfxBeginThread返回的测试不足以保证线程创建成功并且句柄有效,要么是句柄在WaitForMultipleObjects调用之前变得无效,我认为可以通过将m_bAutoDelete设置为FALSE来防止这一点。

当多个线程由AfxBeginThread创建时,有没有更好的方法来等待它们

请注意,当使用maxThreads=1时,这是可以的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-23 19:54:46

handles[0]指向有一个有效句柄的对象,后面可能跟有一些数据。相反,maxThreads建议数组在那里应该有两个句柄。因此出现了错误。

这就是你想要的:

代码语言:javascript
复制
HANDLE handles[maxThreads];
//...
handles[threadId] = threads[threadId]->m_hThread;
//...
WaitForMultipleObjects(maxThreads, handles, ...
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12090863

复制
相关文章

相似问题

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