社区
C++ 语言
帖子详情
请教高手!用WaitForSingleObject 构造自己的WaitForMultipleObjects
dronly
2006-06-29 10:11:46
因为WaitForMultipleObjects的等待最大值只能有 MAXIMUM_WAIT_OBJECTS (64)个
所以想是不是能够用 WaitForSingleObject 写一个自己的 WaitForMultipleObjects 可以解决最大64的限制
...全文
217
6
打赏
收藏
请教高手!用WaitForSingleObject 构造自己的WaitForMultipleObjects
因为WaitForMultipleObjects的等待最大值只能有 MAXIMUM_WAIT_OBJECTS (64)个 所以想是不是能够用 WaitForSingleObject 写一个自己的 WaitForMultipleObjects 可以解决最大64的限制
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
关注
音视频的同步-转载
使用timeBeginPeriod设置Sleep精度 timeBeginPeriod(1); timeEndPeriod(1); 1. 音视频同步的原理 2. 音视频同步的较正方法 3. 音视频同步时遇到的问题 声明:以下所有内容均为转载 1.原文转自:...
二本本科生如何才能进入腾讯/阿里/百度这样的大厂?
好在,两年过去了,天道酬勤,功不唐捐,一位二本的同学逆袭拿到了大厂的 offer,在毕业之际为自己的职业生涯开了一个好头,祝这位同学发展越来越好。作为一名过来人的老学长,我码这么多字,希望想做好开发的学弟...
一个二本本科生如何才能进入腾讯,阿里,百度这些大厂?
我建立了一个高性能服务器开发群,这个群帮助了无数的学生,后来群的人越来越多,我又单独为学生朋友建立了一个学生希望工程群,我不定期会在这些群里做一些技术分享,群里面很多同学学历都不好,但最终通过自己的...
编程知识点、技能点汇集收录
208 3.6 Windows线程同步对象… 217 3.6.1
Wait
For
Single
Object
与
Wait
For
Multiple
Object
s函数… 217 3.6.2 Windows临界区对象… 219 3.6.3 Windows Event对象… 224 3.6.4 Windows Mutex对象… 229 3.6.5 Windows ...
永久勘误:微软等面试100题答案V0.3版[第21-40题答案]
请教
如何推理,A是怎么知道的。如果用程序,又怎么实现呢? //July、2010/10/22 //今是老妈生日,祝福老妈,生日快乐。!:). 4张 r 4张b 有以下3种组合: rr bb rb 1.B,C全是一种颜色 B C A bb.rr bb.rr 2....
C++ 语言
64,647
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章