#include "stdafx.h"#pragma warning(disable: 4786)#include <stdio.h>#include <iostream.h>
#include<windows.h>#define Max_Count 10HANDLE 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程序。自己写来耍的。如果有不规范的地方,还请海涵

解决方案 »

  1.   

    不是,在线程中加点sleep之类的,一样不会触发,返回值那个地方还是0
      

  2.   

    多次创建要SLEEP下。
    if (n_dwRtn!= WAIT_TIMEOUT)
    {
       n_dwRtn -= WAIT_OBJECT_0;
        //do 线程事情。
       switch(n_dwRtn)
       {
          case 0:
         ..........
          case 1:(比方说是退出线程。)
             {
                  返回掉
               }
       }}
                     
      

  3.   

    WaitForMultipleObjects handle序列要非空的连续排在前面 如果有置空的 需要对这个handle数组重新整理一下。g_hOperation就是需要这样处理的数组