我第一次使用多线程编程。我用一个同步管理线程和若干工作线程配合计算,我在同步管理线程开始工作时创建了工作线程并创建了几个具名的Event用于线程间同步。由工作线程激发Event,管理线程用OpenEvent()函数打开Event句柄后等待它激发。但出现了一个奇怪的问题: 
  程序使用VC++6.0编译器在F5不设断点的情况下可以正常运行,但是用Ctrl+F5运行时OpenEvent()无法打开Event,用GetLasrError()返回值2,即——系统无法找到文件。 
   代码很长,我把引起错误的那段贴出来。
 
   创建的Event和后边打开的Event名字都对得上,代码中的那些都是变量名。
   线程对象是从CWinThread派生的。
.... 
#define INIT_EVENT                      "InitEvent" 
... 在同步管理线程对象的一个函数中创建Event 
CString lmissileid;
...
lInitEventName = INIT_EVENT + lmissileid; 
lhInitEvent = CreateEvent(NULL,TRUE,FALSE,(LPCSTR)lInitEventName); 
... 
在同步管理线程的其它函数中打开Event 
... 
typedef HANDLE __SynchInitKey 
.... 
_SynchInitKey* CAdminThread::AcquireSynchInitKey(CString* pAddWeaID)//根据传入的ID号找出对应的Event并放入数组中 

    unsigned int lAddWeaCount; 
    unsigned int lcount; 
    __SynchInitKey* phandle; 
    __SynchInitKey hInitEvent; 
    CString* plAddWeaID; 
    CString lInitEventName; 
    DWORD lresult; 
    plAddWeaID = pAddWeaID; 
    lAddWeaCount = m_pExp->AddASatMNum + m_pExp->AddTgtNum; 
    phandle = new __SynchInitKey[lAddWeaCount]; 
    for (lcount = 0;lcount < lAddWeaCount;lcount++)//建立初始化同步Event数组 
    { 
        lInitEventName = INIT_EVENT + *(plAddWeaID + lcount); 
        hInitEvent = OpenEvent(EVENT_ALL_ACCESS, 
                               FALSE, 
                               lInitEventName); 
        lresult = GetLastError(); 
        ASSERT(lresult != ERROR_FILE_NOT_FOUND);//***这里的断言F5运行不出错,Ctrl+F5脱离调试器运行就过不去,怎么回事** //
        *(phandle + lcount) = hInitEvent; 
    } 
    return phandle; 
}   因为以前没有使用多线程编程的经历所以不知道怎样解决这个问题,不知道那位高手帮我解决这个问题,或者告诉我一个解决的方法或思路,谢谢。 

解决方案 »

  1.   

    单步查看lInitEventName的值正常么
      

  2.   

    单步跟踪一切正常,点execute 就不正常了,晕死了。
      

  3.   

    补充一点:刚才测试了一下,这个问题还可以描述为:
        在线程函数的for循环里创建Event,在for循环外使用OpenEvent()F5单步、不设断点全速都没问题,但是crtl+F5就法打开Event了。这是为什么.... 
    #define INIT_EVENT                      "InitEvent" 
    ... 在同步管理线程对象的一个函数中创建Event 
    //**********************这部分在for循环里*****************
    CString lmissileid; 
    ... 
    lInitEventName = INIT_EVENT + lmissileid; 
    lhInitEvent = CreateEvent(NULL,TRUE,FALSE,(LPCSTR)lInitEventName); 
    ... 
    ///////////////////
    在同步管理线程的其它函数中打开Event //********************这部分在for循环外*********************
    ... 
    typedef HANDLE __SynchInitKey 
    .... 
    _SynchInitKey* CAdminThread::AcquireSynchInitKey(CString* pAddWeaID)//根据传入的ID号找出对应的Event并放入数组中 

        unsigned int lAddWeaCount; 
        unsigned int lcount; 
        __SynchInitKey* phandle; 
        __SynchInitKey hInitEvent; 
        CString* plAddWeaID; 
        CString lInitEventName; 
        DWORD lresult; 
        plAddWeaID = pAddWeaID; 
        lAddWeaCount = m_pExp->AddASatMNum + m_pExp->AddTgtNum; 
        phandle = new __SynchInitKey[lAddWeaCount]; 
        for (lcount = 0;lcount < lAddWeaCount;lcount++)//建立初始化同步Event数组 
        { 
            lInitEventName = INIT_EVENT + *(plAddWeaID + lcount); 
            hInitEvent = OpenEvent(EVENT_ALL_ACCESS, 
                                  FALSE, 
                                  lInitEventName); 
            lresult = GetLastError(); 
            ASSERT(lresult != ERROR_FILE_NOT_FOUND);//***这里的断言F5运行不出错,Ctrl+F5脱离调试器运行就过不去,怎么回事** // 
            *(phandle + lcount) = hInitEvent; 
        } 
        return phandle; 
      

  4.   

    仔细检查lInitEventName的值吧,应该是要打开的Event根本就没创建,检查下
    //**********************这部分在for循环里***************** 
    CString lmissileid; 
    ... 
    lInitEventName = INIT_EVENT + lmissileid; 
    lhInitEvent = CreateEvent(NULL,TRUE,FALSE,(LPCSTR)lInitEventName); 
    ... 
    /////////////////// 
    是否创建了设想的事件hInitEvent = OpenEvent(EVENT_ALL_ACCESS, 
                                  FALSE, 
                                  lInitEventName);
    ASSERT(hInitEvent != NULL) ; //不过既然是一个进程没必要Create了又Open的,直接用HANDLE就是了
      

  5.   

    问题找到了,是GetLastError()的问题。