Delphi TIdTCPServer如何在60Hz定时器中多播到所有客户端?

Delphi TIdTCPServer如何在60Hz定时器中多播到所有客户端?,delphi,tcp,real-time,c++builder,broadcast,Delphi,Tcp,Real Time,C++builder,Broadcast,我是一个和印地一起工作的新手。这是我第一次在这里发帖 我的项目必须以60Hz的频率向所有客户发送数据。为此,我正在使用TIdTCPServer,并监视保持生命。我的工具非常旧,运行在WinXP上,使用C++Builder 6和Indy 8。有一个潜在的超时问题,是否有人有一个很好的想法如何处理它 这是我的密码: 服务器端 typedef结构 { AnsiString PeerIP;//{Cleint IP地址} AnsiString HostName;//{HostName} int-Id;/{

我是一个和印地一起工作的新手。这是我第一次在这里发帖

我的项目必须以60Hz的频率向所有客户发送数据。为此,我正在使用
TIdTCPServer
,并监视保持生命。我的工具非常旧,运行在WinXP上,使用C++Builder 6和Indy 8。有一个潜在的超时问题,是否有人有一个很好的想法如何处理它

这是我的密码:

服务器端

typedef结构
{
AnsiString PeerIP;//{Cleint IP地址}
AnsiString HostName;//{HostName}
int-Id;/{Cleint-Id}
}客户;
//这是多媒体定时器回调函数,频率为60Hz
无效回调mmTimerProc(UINT-wTimerID、UINT-msg、DWORD dwUser、DWORD dw1、DWORD dw2)
{
德沃德T1,T2;
TfmMain*pMain=(TfmMain*)dwUser;
整数指数;
双dT;
t客户端*p客户端;
如果(pMain->IsClosing)返回;
如果(pMain->Shutdown)
{
返回;
}
pMain->UpdateServer1Data();
TList*pList=pMain->IdTCPServer1->Threads->LockList();
尝试
{
对于(int X=0;XCount;X++)
{
如果(!pMain->isclose)
{
TIdPeerThread*AThread=(TIdPeerThread*)pList->Items[X];
if(AThread!=NULL)
{
pClient=(TClient*)读取->数据;
尝试
{
如果(!AThread->Connection->ClosedGracefully)
{
//向所有客户端发送数据
AThread->Connection->WriteBuffer(&pMain->Data2Client,sizeof(pMain->Data2Client),true);
}
}
捕获(例外和E)
{
如果(!AThread->已停止)
{
AThread->Stop();
AThread->Connection->Disconnect();
}
}
}
}
}
}
__最后
{
pMain->IdTCPServer1->Threads->UnlockList();
}
//关闭计算机或关闭应用程序
如果(pMain->SimIos.Status.iSimStatus==11)
{
pMain->Shutdown=true;
pMain->CloseApp();
}
}
void\uu fastcall TfmMain::IdTCPServer1Connect(TIdPeerThread*AThread)
{
TClient*pClient=NULL;
翻译原文;
AnsiString PeerIP=AThread->Connection->Binding->PeerIP;
TDateTime TimeConnected=Now();
ABuffer=AThread->Connection->ReadLn();
如果((辅助位置(“TT”)==0)和&(辅助位置(“IG”)==0)和&(辅助位置(“RR”)==0))
{
text=AnsiString().sprintf(“1>>未知(%s)(在%s上)连接非法!…”,
PeerIP,DateTimeToStr(TimeConnected));
书面形式(文本);
AThread->Connection->Disconnect();
返回;
}
如果(附件位置(“IG”)!=0)
{
pClient=新的TClient;
pClient->PeerIP=PeerIP;
pClient->HostName=Clients[eIG];
pClient->Id=eIG;
AThread->Data=(TObject*)pClient;
AThread->FreeOnTerminate=true;
//报表客户端已联机
}
text=AnsiString().sprintf(“1>>>%s(%s)在第%s行上!”,
pClient->HostName,PeerIP,DateTimeToStr(TimeConnected));
书面形式(文本);
}
//---------------------------------------------------------------------------
void\uu fastcall TfmMain::IdTCPServer1Disconnect(TIdPeerThread*AThread)
{
TClient*pClient=NULL;
发散味精;
如果(正在关闭)返回;
pClient=(TClient*)读取->数据;
如果(pClient->Id==1)
{
//报表客户端已脱机
Msg=AnsiString().sprintf(“1>>>%s(%s)在%s上脱机…”,
pClient->HostName,pClient->PeerIP,DateTimeToStr(Now());
书面签名(Msg);
}
删除pClient;
AThread->Data=NULL;
AThread->Terminate();
尝试
{
IdTCPServer1->Threads->LockList()->Remove(AThread);
}
__最后
{
IdTCPServer1->Threads->UnlockList();
}
}
//---------------------------------------------------------------------------
void u fastcall TfmMain::IdTCPServer1Execute(TIdPeerThread*AThread)
{
t客户端*p客户端;
如果(!AThread->终止&&!正在关闭)
{
pClient=(TClient*)读取->数据;
如果((pClient!=NULL)&&(pClient->Id!=0))
{
尝试
{
如果(pClient->Id==1)
{
//报告客户端仍处于活动状态
}
}
捕获(例外和E)
{
如果(!正在关闭)
{
如果(!AThread->已停止)
{
AThread->Stop();
AThread->Connection->Disconnect();
}
}
}
}
}
}
客户端

void\uu fastcall TSocketThread::Execute()
{
无符号长校验和;
模拟SVR1确认结构Ack2Svr;
来自SVR的SIM_SVR_数据;
整数计数器;
memset(&DataFromSvr,0,sizeof(DataFromSvr));
memset(&Ack2Svr,0,sizeof(Ack2Svr));
计数器=0;
//获取并处理命令,直到连接或线程终止
而(!this->Terminated&&FSocket->Connected())
{
尝试
{
//从服务器接收数据
FSocket->ReadBuffer(&DataFromSvr,sizeof(DataFromSvr));
//校验CRC
ulCheckSum=CRC_32((无符号字符*)&DataFromSvr.SimData,sizeof(DataFromSvr.SimData));
if(ulCheckSum==DataFromSvr.uiCheckSum)
{
fsmicutil->Writeto(&DataFromSvr.SimData,DATA_OFFSET,sizeof(DataFromSvr.SimData));
}
其他的
{
//计数器记录错误
同步(更新选项);
}
//读r