void CTaskBarDlg::UpdateChannel(CDatabase *pdb)
{
CChannelSet comset(pdb);
if (comset.Open())
{
while (!comset.IsEOF())
{
....
pchannel = new CChannelSingle(&channel,this);//读到一条记录就分配一个pchannel空间
pchannel->InitPort();//初始化串口
m_comm.Add(pchannel);
comset.MoveNext();
}
comset.Close();
}
}
BOOL CChannelSingle::InitPort()
{
.........
if((m_ovRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
return FALSE;
if((hExitEvent=CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL)
return FALSE;
if((m_ovWrite.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
return FALSE;
m_hEventArray[0] = m_ovWrite.hEvent;
m_hEventArray[1] = m_ovRead.hEvent;
m_hEventArray[2] = hExitEvent; m_pThread = AfxBeginThread(CommProc,this,THREAD_PRIORITY_NORMAL,0,
CREATE_SUSPENDED,NULL) ;//一个串口创建一个线程
if(m_pThread == NULL)
{
CloseHandle(m_hCom[0]);
return FALSE;
}
else
{
m_bConnected = TRUE;
m_pThread->ResumeThread();
}
}
}
现在的问题是如何释放pchannel以及如何退出多个工作线程?
{
CChannelSet comset(pdb);
if (comset.Open())
{
while (!comset.IsEOF())
{
....
pchannel = new CChannelSingle(&channel,this);//读到一条记录就分配一个pchannel空间
pchannel->InitPort();//初始化串口
m_comm.Add(pchannel);
comset.MoveNext();
}
comset.Close();
}
}
BOOL CChannelSingle::InitPort()
{
.........
if((m_ovRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
return FALSE;
if((hExitEvent=CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL)
return FALSE;
if((m_ovWrite.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
return FALSE;
m_hEventArray[0] = m_ovWrite.hEvent;
m_hEventArray[1] = m_ovRead.hEvent;
m_hEventArray[2] = hExitEvent; m_pThread = AfxBeginThread(CommProc,this,THREAD_PRIORITY_NORMAL,0,
CREATE_SUSPENDED,NULL) ;//一个串口创建一个线程
if(m_pThread == NULL)
{
CloseHandle(m_hCom[0]);
return FALSE;
}
else
{
m_bConnected = TRUE;
m_pThread->ResumeThread();
}
}
}
现在的问题是如何释放pchannel以及如何退出多个工作线程?
CREATE_SUSPENDED,NULL) ;//一个串口创建一个线程
这句有问题,会丢失之前创建的线程句柄
线程一般都是自动退出,系统内部会自动释放资源
退出时,需要Wait一下,等线程安全退出后,再退出主线程
否则会引起异常报错