//基本代码如下:本人刚学VC,代码不合适请指出,谢谢!
//stdafx.h//=============================//
UINT TestThread(LPVOID n);
class ThreadInfo  
{
public:
int ThreadId;
};
//mymain.cpp //=============================//
#include "stdafx.h"HANDLE m_hEventStop;
HANDLE m_hEventStopeds[3];
ThreadInfo *ThreadInfos[3]; //线程信息组
CWinThread* tThreads[3]; //线程组int main(int argc, char* argv[])
{
m_hEventStop=::CreateEvent(NULL,TRUE,FALSE,NULL);
for(int i=0;i<3;i++)
{
ThreadInfos[i]=new ThreadInfo();
ThreadInfos[i]->ThreadId=i;
m_hEventStopeds[i]=::CreateEvent(NULL,TRUE,FALSE,NULL);
tThreads[i]=AfxBeginThread(TestThread,(LPVOID)ThreadInfos[i]);
}
::Sleep(200);
printf("\n线程正在执行!\n");
::SetEvent(m_hEventStop);
printf("\n线程将要关闭!\n");
if(WaitForMultipleObjects(3,m_hEventStopeds,true,INFINITE)!=WAIT_OBJECT_0)
printf("\nWaitForMultipleObjects错误!\n");
else
printf("线程正常结束\n");
return 0;
}UINT TestThread(LPVOID n)
{
ThreadInfo *pInfo=(ThreadInfo *)n;
while(true)
{
printf("%d",pInfo->ThreadId);
::Sleep(100);
if(::WaitForSingleObject(m_hEventStop,0)== WAIT_OBJECT_0)
break;
}
::SetEvent(m_hEventStopeds[pInfo->ThreadId]);
printf("\n(关闭线程%d)\n",pInfo->ThreadId);
return 0;
}
//=============================//执行的输出结果差不多每次都是:
012102
线程正在执行!线程将要关闭!(关闭线程1)(关闭线程0)WaitForMultipleObjects错误!
//===================
不明白为什么WaitForMultipleObjects没有等到3个线程的停止事件?

解决方案 »

  1.   

    printf("\n(关闭线程%d)\n",pInfo->ThreadId);
    之后主进程都结束了
    在return 0 之前 加::Sleep(200);呢?
      

  2.   

    if(::WaitForSingleObject(m_hEventStop,0)== WAIT_OBJECT_0)
    break;
    的WaitForSingleObject 改为 WSAWaitForMultipleEvents用法参考msdn
      

  3.   

    原来的程序其实也没什么太大的错误,不过我觉得这样更合理些
    class ThreadInfo  
    {
    public:
    DWORD ThreadId;
    };
    //mymain.cpp //=============================//
    #include "stdafx.h"HANDLE m_hEventStop;
    HANDLE m_hEventStopeds[3];
    //ThreadInfo *ThreadInfos[3]; //线程信息组
    HANDLE tThreads[3]; //线程组 这里保存线程句柄数组
    DWORD CALLBACK TestThread(LPVOID n)
    {
    ThreadInfo *pInfo=(ThreadInfo *)n;
    while(true)
    {
    printf("%d",pInfo->ThreadId);
    ::Sleep(100);
    if(::WaitForSingleObject(m_hEventStop,0)== WAIT_OBJECT_0)
    break;
    }
    ::SetEvent(m_hEventStopeds[pInfo->ThreadId]);
    printf("\n(关闭线程%d)\n",pInfo->ThreadId);
    return 0;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    m_hEventStop=::CreateEvent(NULL,TRUE,FALSE,NULL);
    for(int i=0;i<3;i++)
    {
    ThreadInfos[i]=new ThreadInfo();
    ThreadInfos[i]->ThreadId=i;
    //m_hEventStopeds[i]=::CreateEvent(NULL,TRUE,FALSE,NULL);
    DWORD dwThreadId;
    tThreads[i]=::CreateThread(
    NULL,
    0,
    TestThread,
    ThreadInfos[i],
    0,
    &dwThreadId
    );//AfxBeginThread(TestThread,(LPVOID)ThreadInfos[i]);
    }
    ::Sleep(200);
    printf("\n线程正在执行!\n");
    ::SetEvent(m_hEventStop);
    printf("\n线程将要关闭!\n");
    if(WaitForMultipleObjects(3,tThreads,true,INFINITE)!=WAIT_OBJECT_0) // 这里等待所有线程退出,这样可以确保线程真正退出了才返回
    printf("\nWaitForMultipleObjects错误!\n");
    else
    printf("线程正常结束\n"); system( "pause" );
    return 0;
    }
      

  4.   

    HANDLE hEvents[2]; 
    DWORD i, dwEvent; // Create two event objects.for (i = 0; i < 2; i++) 

        hEvents[i] = CreateEvent( 
            NULL,   // default security attributes
            FALSE,  // auto-reset event object
            FALSE,  // initial state is nonsignaled
            NULL);  // unnamed object    if (hEvents[i] == NULL) 
        { 
            printf("CreateEvent error: %d\n", GetLastError() ); 
            ExitProcess(0); 
        } 
    } // The creating thread waits for other threads or processes
    // to signal the event objects.dwEvent = WaitForMultipleObjects( 
        2,           // number of objects in array
        hEvents,     // array of objects
        FALSE,       // wait for any
        INFINITE);   // indefinite wait// Return value indicates which event is signaled.switch (dwEvent) 

        // hEvent[0] was signaled.
        case WAIT_OBJECT_0 + 0: 
            // Perform tasks required by this event.
            break;     // hEvent[1] was signaled.
        case WAIT_OBJECT_0 + 1: 
            // Perform tasks required by this event.
            break;     // Return value is invalid.
        default: 
            printf("Wait error: %d\n", GetLastError()); 
            ExitProcess(0); 
    }
      

  5.   

    等到m_hEventStopeds[0]事件的时候,返回的结果是WAIT_OBJECT_0,你的程序执行的结果是正确的。
      

  6.   

    呵呵,我又看错了,其实你的程序是正常的,
    只不过你这样在线程中
    ::SetEvent(m_hEventStopeds[pInfo->ThreadId]);
    printf("\n(关闭线程%d)\n",pInfo->ThreadId);
    先设置Event,再打印信息,主线程收到最后一个信号,立即就退出了,子线程的打印信息还没来得及显示,把两个语句换个位置看看
      

  7.   

    谢谢各位大人的意见!
    本来我要解决的问题是在MFC对话框程序中等待多线程结束的问题,所以写了这个例子,但到现在还没完全弄清楚,开帖重问。