由于功能的MAXIMUM_WAIT_OBJECTS
限制WaitForMultipleObjects
,我尝试编写自己的“等待线程”功能,但没有成功。你能给我一个提示吗,怎么做?
这是我的“等待线程”功能:
void WaitForThreads(std::set<HANDLE>& handles)
{
for (int i = 0; i < SECONDSTOWAIT; i++)
{
// erase idiom
for (std::set<HANDLE>::iterator it = handles.begin();
it != handles.end();)
{
if (WaitForSingleObject(*it, 0) == WAIT_OBJECT_0)
handles.erase(it++);
else
++it;
}
if (!handles.size())
// all threads terminated
return;
Sleep(1000);
}
// handles.size() threads still running
handles.clear();
}
只要线程运行就WaitForSingleObject
返回WAIT_TIMEOUT
,但是当线程终止时,返回值WAIT_FAILED
不是WAIT_OBJECT_0
. 我猜线程句柄不再有效,因为GetLastError
返回ERROR_INVALID_HANDLE
。
MSDN 建议以下解决方案:
- 创建一个线程以等待 MAXIMUM_WAIT_OBJECTS 句柄,然后在该线程和其他句柄上等待。使用此技术将句柄分成 MAXIMUM_WAIT_OBJECTS 组。
- 调用 RegisterWaitForSingleObject 以等待每个句柄。线程池中的等待线程等待 MAXIMUM_WAIT_OBJECTS 注册对象,并在对象发出信号或超时间隔到期后分配一个工作线程。
但在我看来,两者都太过分了。
编辑:
线程是使用 MFC 函数创建的AfxBeginThread
。返回的CWinThread
指针仅用于获取关联的句柄。
CWinThread* thread = AfxBeginThread(LANAbfrage, par);
if ((*thread).m_hThread)
{
threads.insert((*thread).m_hThread);
helper::setStatus("%u LAN Threads active", threads.size());
}
else
theVar->TraceN("Error: Can not create thread");