解决方案 »

  1.   

    1. CEvent可以CreateEvent(NULL, TRUE, FALSE, NULL)手动重置,配合CRITICAL_SECTION使用
    当有新数据插入时SetEvent,当为空时ResetEvent
      

  2.   

    2. GetCurrentThread();
        GetCurrentThreadId();
      

  3.   

    但是,SetEvent()貌似只能激活一个工作线程,不可能执行一次,把所有线程都激活。
      

  4.   

    但是,SetEvent()貌似只能激活一个工作线程,不可能执行一次,把所有线程都激活。
    Sorry,我错了。一开始对CreateEvent 的自动手动不是很理解,现在貌似可以了,谢谢!!
      

  5.   

    但是,SetEvent()貌似只能激活一个工作线程,不可能执行一次,把所有线程都激活。
    --------------------------------------------------------------------------------------------------------------------------
    你的工作线程不是共用一个线程函数吗?再说,当这些工作线程都激活之后,也不可能是并行处理的,因为他们的处理函数是同一个,并行处理会乱掉的,必须控制互斥!HEVENT __hEvent__ = ::CreateEvent(NULL, TRUE, FALSE, NULL) //手动重置,初始无信号
    CRITICAL_SECTION __cs__={0};   //用于控制工作线程间互斥
    InitializeCriticalSection(&__cs__);
    BOOL  bFlag = FALSE;   //工作线程是否已处理过DWORD WINAPI WorkerProc(LPVOID lParam)
    {
            if(!bFlag)
            {
            ::WaitForSingleObject(__hEvent__ ,INFINITE); //当有新数据插入时手动置为有信号,bFlag = FALSE;
            do
            {
                            if(bFlag)          //双重检测
                            {
                    ::EnterCriticalSection(&__cs__);
                    ...........
                                    ...........
                    ::LeaveCriticalSection(&__cs__);
                                    bFlag = TRUE;
                            }
            }while(0);
            //ResetEvent(__hEvent__ );
            }
    return 0;
    }::CloseHandle(__hEvent__ );
    ::DeleteCriticalSection(&__cs__);
      

  6.   


    HEVENT __hEvent__ = ::CreateEvent(NULL, TRUE, FALSE, NULL) //手动重置,初始无信号
    CRITICAL_SECTION __cs__={0};   //用于控制工作线程间互斥
    InitializeCriticalSection(&__cs__);
    BOOL  bFlag = FALSE;   //工作线程是否已处理过DWORD WINAPI WorkerProc(LPVOID lParam)
    {
    if(!bFlag)
        {
            ::WaitForSingleObject(__hEvent__ ,INFINITE);  //当有新数据插入时手动置为有信号,bFlag = FALSE;
            do
            {
    if(bFlag)          //双重检测
    {
                    ::EnterCriticalSection(&__cs__);
    //...........
    //...........
                    ::LeaveCriticalSection(&__cs__);
    bFlag = TRUE;
    }
            }while(0);
            //ResetEvent(__hEvent__ );
    }
    return 0;
    }::CloseHandle(__hEvent__ );
    ::DeleteCriticalSection(&__cs__);
      

  7.   

    if(bFlag)          //双重检测
    {
                    ::EnterCriticalSection(&__cs__);
    //...........
    //...........
                    ::LeaveCriticalSection(&__cs__);
    bFlag = TRUE;
    }
    这个逻辑有没有问题,如果bFlag为真,运行判断并置bFlag为真
      

  8.   

    if(bFlag)          //双重检测
    {
                    ::EnterCriticalSection(&__cs__);
    //...........
    //...........
                    ::LeaveCriticalSection(&__cs__);
    bFlag = TRUE;
    }
    这个逻辑有没有问题,如果bFlag为真,运行判断并置bFlag为真错了错了,少个!
    if(!bFlag)          //双重检测