自己写了个WaitForMultipleObjects的应用程序,有bug

wutaihua 2009-09-03 04:00:24

#include "stdafx.h"

#pragma warning(disable: 4786)

#include <stdio.h>

#include <iostream.h>
#include<windows.h>

#define Max_Count 10

HANDLE g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
CRITICAL_SECTION g_CriSec;

DWORD g_threadId[10];
HANDLE g_hOperation[10];


static void putEx(char *pChar)
{
EnterCriticalSection(&g_CriSec);
puts(pChar);
LeaveCriticalSection(&g_CriSec);
};

static DWORD WaitThread(LPARAM lparm)
{
int nIndex = *(int*)lparm;
printf("线程启动\n");
return 0;
}

int main()
{
InitializeCriticalSection(&g_CriSec);


for(int i = 0; i< Max_Count; i++)
{
g_hOperation[i] = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&WaitThread,
&i, NULL, &g_threadId[i]);
}


while(1)
{
int nIndex = 0;
DWORD dwRtn = WaitForMultipleObjects(Max_Count, g_hOperation, FALSE, INFINITE);//为什么这个地方的dwRtn 返回值一直是0呢。奇怪了。所以求助下


switch (dwRtn)
{
case WAIT_TIMEOUT:
putEx("等待超时");
break;
case WAIT_FAILED:
putEx("等待失败");
break;
default:
{
nIndex = dwRtn - WAIT_TIMEOUT;

if(nIndex <= Max_Count && nIndex >= 0)
{
printf("关闭句柄%d\n", nIndex);
CloseHandle(g_hOperation[nIndex]);
g_hOperation[nIndex] = NULL;
}

}
}
DeleteCriticalSection(&g_CriSec);
}
return 0;
}


WaitForMultipleObjects 返回值一直是0.不知道为什么。我写过一个信号量的处理,也是这么回事。这是个demo程序。自己写来耍的。如果有不规范的地方,还请海涵
...全文
44 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wutaihua 2011-07-01
  • 打赏
  • 举报
回复
WaitForMultipleObjects handle序列要非空的连续排在前面 如果有置空的 需要对这个handle数组重新整理一下。g_hOperation就是需要这样处理的数组
toupride 2009-09-03
  • 打赏
  • 举报
回复
多次创建要SLEEP下。
if (n_dwRtn!= WAIT_TIMEOUT)
{
n_dwRtn -= WAIT_OBJECT_0;
//do 线程事情。
switch(n_dwRtn)
{
case 0:
..........
case 1:(比方说是退出线程。)

返回掉

}

}
wutaihua 2009-09-03
  • 打赏
  • 举报
回复
自己搞定了,结贴~~~
wutaihua 2009-09-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iamwjp 的回复:]
是不是线程已经退出了
[/Quote]
不是,在线程中加点sleep之类的,一样不会触发,返回值那个地方还是0
iamwjp 2009-09-03
  • 打赏
  • 举报
回复
是不是线程已经退出了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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