我第一次使用多线程编程。我用一个同步管理线程和若干工作线程配合计算,我在同步管理线程开始工作时创建了工作线程并创建了几个具名的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;
} 因为以前没有使用多线程编程的经历所以不知道怎样解决这个问题,不知道那位高手帮我解决这个问题,或者告诉我一个解决的方法或思路,谢谢。
程序使用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;
} 因为以前没有使用多线程编程的经历所以不知道怎样解决这个问题,不知道那位高手帮我解决这个问题,或者告诉我一个解决的方法或思路,谢谢。
在线程函数的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;
}
//**********************这部分在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就是了