私はC++BuilderXE3でIndyを使用しています。それは完璧なシステムですが、私はいくつかの問題を抱えています。IdTCPServerは非常にうまく機能しますが、彼にいくつかの接続があり、サーバーを停止したい場合、アプリケーションがフリーズしました。私はそれをどのように行うかを段階的に説明しようとしています:1)アプリケーションを起動する(そしてサーバーをリッスンする)2)新しい接続を待つ(またはシミュレートする、違いはない)3)接続が10〜15になったらサーバーを停止してみてください聞いている。4)コードがIdTCPServer1-> Active=falseに到達したとき-アプリケーションはフリーズします
私は小さなビデオを作りました。多分それは状況をはるかによく説明します。http://www.youtube.com/watch?v=BNgTxYbLx8g
そしてここに私のコード:
OnConnect:
EnterCriticalSection(&CritLock);
++ActiveConnections;
SetActiveConnections(ActiveConnections);
LeaveCriticalSection(&CritLock);
OnDisconnect:
EnterCriticalSection(&CritLock);
--ActiveConnections;
SetActiveConnections(ActiveConnections);
LeaveCriticalSection(&CritLock);
StopServerコード:
void TForm1::StopServer()
{
TList *list = IdTCPServer1->Contexts->LockList();
try
{
for(int i = 0; i < list->Count; ++i)
{
TIdContext *AContext = reinterpret_cast<TIdContext*>(list->Items[i]);
try
{
if (AContext->Connection->Connected())
{
AContext->Connection->IOHandler->InputBuffer->Clear();
AContext->Connection->IOHandler->WriteBufferCancel();
AContext->Connection->IOHandler->WriteBufferClear();
AContext->Connection->IOHandler->WriteBufferClose();
AContext->Connection->IOHandler->CloseGracefully();
AContext->Connection->Disconnect();
}
}
catch (const Exception &e)
{
}
}
}
__finally
{
IdTCPServer1->Contexts->UnlockList();
}
IdTCPServer1->Contexts->Clear();
//IdTCPServer1->StopListening();
IdTCPServer1->Active = false;
}
アドバイスありがとうございます!