结构是这样的,在View里面创建了两个线程 m_SqlThread,CYDSendThread。负责操作数据库和SOCKET。两个线程都继承自 CWinThread,
结构都是BOOL InitInstance()
{
////在操作socket的线程里,这里创建了两个SOCKET,是继承CAsyncSocket的
while(CGateView.m_StateFlag)
{
////做事情
}
return true;
}
下面是窗口关闭前调用的,但有时候会没用,虽然窗口关了,但程序还在任务栏列表里面。
void CGateView::DoBeforeClose()
{
m_StateFlag=FALSE;
::Sleep(2000);
if(m_SqlThread.m_hThread)
{
m_SqlThread.SuspendThread();
}
pThread->SuspendThread();//操作socket的线程 CYDSendThread
pThread->m_pSendSocket[0]->Close();
pThread->m_pSendSocket[1]->Close();
m_YdSendList.RemoveAt(tmp);
delete pThread;
pThread = NULL;
Sleep(1000);
}
结构都是BOOL InitInstance()
{
////在操作socket的线程里,这里创建了两个SOCKET,是继承CAsyncSocket的
while(CGateView.m_StateFlag)
{
////做事情
}
return true;
}
下面是窗口关闭前调用的,但有时候会没用,虽然窗口关了,但程序还在任务栏列表里面。
void CGateView::DoBeforeClose()
{
m_StateFlag=FALSE;
::Sleep(2000);
if(m_SqlThread.m_hThread)
{
m_SqlThread.SuspendThread();
}
pThread->SuspendThread();//操作socket的线程 CYDSendThread
pThread->m_pSendSocket[0]->Close();
pThread->m_pSendSocket[1]->Close();
m_YdSendList.RemoveAt(tmp);
delete pThread;
pThread = NULL;
Sleep(1000);
}
pThread.ExitInstance()
在主线程中调用Close或ExitInstance之类的函数是无法退出工作线程的
主线程使该事件受信即可
WaitforSingleObject 跟while(m_StateFlag)不一样吗?
WaitforSingleObject 可以阻塞自己
for(;;)
{
WaitforSingleObject()//加锁,互斥
if(m_StateFlag)
release()//释放锁,重置事件
}控制处用
m_StateFlag=false//设置标志量
WaitforSingleObject()//加锁,互斥
release()//释放锁,重置事件这样,线程肯定会退出
两个线程都继承自 CWinThread,
既然是继承自CWinThread,那么就应该是UI线程乐,可是看你的代码BOOL InitInstance()
{
////在操作socket的线程里,这里创建了两个SOCKET,是继承CAsyncSocket的
while(CGateView.m_StateFlag)
{
////做事情
}
return true;
}把他们当成工作组线程了,而且还不如工作组线程呢,因为UI线程的InitInstance是启动初始化的虚函数,你直到要把整个程序都退出的时候才让这个函数运行完,UI线程这时候还要转去处理线程消息队列,应该不会马上结束线程的,而且在InitInstance函数结束之前,线程是无法响应诸如:SuspendThread等要求的