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以及如何退出多个工作线程?