请教高手!用WaitForSingleObject 构造自己的WaitForMultipleObjects

dronly 2006-06-29 10:11:46
因为WaitForMultipleObjects的等待最大值只能有 MAXIMUM_WAIT_OBJECTS (64)个

所以想是不是能够用 WaitForSingleObject 写一个自己的 WaitForMultipleObjects 可以解决最大64的限制
...全文
217 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dronly 2006-07-01
  • 打赏
  • 举报
回复
呵呵,我把你主要的代码自己在VC做了个工程去试,果然可以~~~

因为是WaitForSingleObject 构造的关系,之前还担心会不回处理不到系统的消息

但仔细的看过后,连跟原来的WaitForMultipleObjects 的返回形式都是一样的

果然高手~~~~

谢谢你的回复

在此结贴了.
dronly 2006-06-30
  • 打赏
  • 举报
回复
谢谢 fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗) 的回答

代码,例子都很详细.

但我还要提一个问题的是:
switch( WaitForSingleObject( lpInner[dwIdx], 0 ) ) 这一句线程已经停住了,CPU的执行单位是指令级别的,会不会出现第一个WaitForSingleObject 结束后到第二个 WaitForSingleObject 开始前出现lpInner[dwIdx] 数组里面全部都已经激活的情况?

这个新做的MyWaitForMultipleObjects可以做到响应多种的系统消息,不知道能不能象原来的WaitForMultipleObjects那样可以对lpInner[dwIdx]里面其中一个激活的核心对象做即使的返回?
fireseed 2006-06-30
  • 打赏
  • 举报
回复
不会停,你没有注意到那个超时参数是0吗?

你最好运行一下代码试试看,然后再说话
fireseed 2006-06-30
  • 打赏
  • 举报
回复

DWORD MyWaitForMultipleObjects( DWORD nCount, const HANDLE* lpHandles,
BOOL bWaitAll, DWORD dwMilliseconds )
{
DWORD dwResult = WAIT_TIMEOUT; // 存储等待结果
DWORD dwSignaled = 0; // 记录信号量通过的句柄数
DWORD dwTickCnt = GetTickCount(); // 累计超时
PHANDLE lpInner = (PHANDLE)VirtualAlloc( 0, // 分柄句柄内存
nCount * sizeof(HANDLE), MEM_COMMIT, PAGE_READWRITE );
if ( lpInner == NULL ) // 检验内存分配失败
{
dwResult = WAIT_FAILED;
}
else
{
CopyMemory( lpInner, lpHandles, nCount * sizeof(HANDLE) ); // 复制句柄
for ( int dwIdx = 0; dwSignaled != nCount; ++dwIdx )
{ // 循环等待所有的信号量
if ( dwIdx == nCount )
{ // 如果访问到末尾,则从头一个重新开始
dwIdx = 0;
}
if ( lpInner[dwIdx] )
{ // 等待当前的信号
switch( WaitForSingleObject( lpInner[dwIdx], 0 ) )
{
case WAIT_ABANDONED:
dwResult = WAIT_ABANDONED_0 + dwIdx;
dwSignaled = nCount;
break;
case WAIT_OBJECT_0:
lpInner[dwIdx] = NULL;
dwSignaled = bWaitAll ? dwSignaled + 1 : nCount;
dwResult = WAIT_OBJECT_0 + dwIdx;
break;
case WAIT_TIMEOUT:
break;
case WAIT_FAILED:
default:
dwResult = WAIT_FAILED;
dwSignaled = nCount;
break;
}
}
if ( GetTickCount() - dwTickCnt > dwMilliseconds )
{
break;
}
Sleep( 1 ); // 空闲,以减少CPU使用
}
}
VirtualFree( lpInner, 0, MEM_RELEASE );
return dwResult;
}

const int g_nEventCnt = 3;
HANDLE g_lpEvents[g_nEventCnt];

DWORD CALLBACK ThreadProc( LPVOID lpParam )
{
DWORD dwResult = MyWaitForMultipleObjects( g_nEventCnt,
g_lpEvents, lpParam != NULL, INFINITE );
cout << "Wait finished: " << dwResult << endl;
return 0;
}

int _tmain( int argc, _TCHAR* argv[] )
{
for ( int i = 0; i < g_nEventCnt; ++i )
{
g_lpEvents[i] = CreateEvent( NULL, FALSE, FALSE, NULL );
}
HANDLE hThread = CreateThread( NULL, 0,
ThreadProc, (LPVOID)0, 0, 0 );
int n;
while ( cin >> n )
{
DWORD dwCode = 0;
GetExitCodeThread( hThread, &dwCode );
if ( n < 0 || n >= g_nEventCnt || dwCode != STILL_ACTIVE )
{
break;
}
SetEvent( g_lpEvents[n] );
}
CloseHandle( hThread );
for ( int i = 0; i < g_nEventCnt; ++i )
{
CloseHandle( g_lpEvents[i] );
}
////////////不可改动//////////////
system( "pause" );
// _CrtDumpMemoryLeaks();
return 0;
////////////不可改动//////////////

}

dronly 2006-06-30
  • 打赏
  • 举报
回复
没有高手做过这方面的程序吗?

herman~~ 2006-06-29
  • 打赏
  • 举报
回复
关注

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧