本文整理汇总了C++中CClient::IsConning方法的典型用法代码示例。如果您正苦于以下问题:C++ CClient::IsConning方法的具体用法?C++ CClient::IsConning怎么用?C++ CClient::IsConning使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CClient
的用法示例。
在下文中一共展示了CClient::IsConning方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: HelperThread
/**
* 清理資源
*/
DWORD __stdcall HelperThread(void* pParam)
{
for (;bServerRunning;)//伺服器正在運行
{
/*
清理已經斷開連接之客戶的記憶體空間。
如果有客戶斷開連線,則必須重新 為鏈表clientlist內的每個客戶端節點取得鏈表clientlist (藉由客戶端節點的GetClientList()函式)
*/
EnterCriticalSection(&csClientList);
CLIENTLIST::iterator iter = clientlist.begin();
BOOL isErase = false;
for (iter; iter != clientlist.end();)
{
CClient *pClient = (CClient*)*iter;
//如果用戶端的連接還存在,則斷開連接,執行緒退出
if (!(pClient->IsConning()))
{
iter = clientlist.erase(iter); //將刪除
isErase = true; //設定Erase flag
}
else{
++iter; // 沒有消除的話在++
}
}
if(isErase) // 如果有移除 將其他clientlist更新
{
iter = clientlist.begin();
for(iter; iter != clientlist.end();)
{
CClient *pTemp = (CClient*)*iter;
pTemp->GetClientList(clientlist);
delete pTemp;
++iter;
}
}
LeaveCriticalSection(&csClientList);
Sleep(TIMEFOR_THREAD_HELP);
}
//伺服器停止工作
if (!bServerRunning)
{
//斷開每個連接,執行緒退出
EnterCriticalSection(&csClientList);
CLIENTLIST::iterator iter = clientlist.begin();
for (iter; iter != clientlist.end();)
{
CClient *pClient = (CClient*)*iter;
//如果用戶端的連接還存在,則斷開連接,執行緒退出
if (pClient->IsConning())
{
pClient->DisConning();
}
++iter;
}
//離開臨界區
LeaveCriticalSection(&csClientList);
//給連接用戶端執行緒時間,使其自動退出
Sleep(TIMEFOR_THREAD_SLEEP);
//進入臨界區
EnterCriticalSection(&csClientList);
//確保為每個用戶端分配的記憶體空間都回收。
//如果不加入while這層迴圈,可能存在這樣的情況。當pClient->IsExit()時,該執行緒還沒有退出。
//那麼就需要從鏈表的開始部分重新判斷。
while ( 0 != clientlist.size())
{
iter = clientlist.begin();
for (iter; iter != clientlist.end();)
{
CClient *pClient = (CClient*)*iter;
if (pClient->IsExit()) //用戶端執行緒已經退出
{
clientlist.erase(iter++); //刪除節點
delete pClient; //釋放記憶體空間
pClient = NULL;
}else{
iter++; //指針下移
}
}
//給連接用戶端執行緒時間,使其自動退出
Sleep(TIMEFOR_THREAD_SLEEP);
}
LeaveCriticalSection(&csClientList);//離開臨界區
}
clientlist.clear(); //清空鏈表
SetEvent(hServerEvent); //通知主執行緒退出
return 0;
}