idtcpserver.active := false 程序就僵死了。
解决方案 »
- 大神帮我看看这段代码问题所在吧,万分感激...在线等哟.....
- 求《Delphi程序设计经典》源代碼
- delphi中怎么获取机器上安装的所有浏览器路径?
- 求SourceOffSite 使用说明
- Delphi写如何提起PC的串口信息
- 如何在让一个窗口的参数传递给另一个窗口(以打开的)
- 【急】【急】【急】求水晶报表for D6的下载,及安装、使用方法
- 请教各位高手 怎样屏蔽掉Memo控件的键盘事件
- 请问:我如何判断所输入的字符串是一个日期?
- 一个本人不会的简单问题
- 求businessskinform 控件的 TbsSkinButtonsBar组件两个问题
- 请教高手关于把excel的数据读到stringgrid。急 !!!
idtcpserver.active := false
就单独这么一句话,如果没有其他代码,程序是不可能崩溃的。
unit MainForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, AdvPanel, AdvGlowButton, Menus, ImgList,global,
AdvOfficePager, IdBaseComponent, IdComponent,IdUDPBase, IdUDPServer, IdContext,
IdCustomTCPServer, IdTCPServer,IdGlobal,IdSocketHandle,Grids, AdvObj, BaseGrid,
AdvGrid, StdCtrls, pngimage, jpeg,IdSchedulerOfThreadPool, IdScheduler,
IdSchedulerOfThread, IdAntiFreezeBase, IdAntiFreeze;type
Tf_mainForm = class(TForm)
UDPServer: TIdUDPServer;
Image1: TImage;
Image2: TImage;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
softListGrid: TAdvStringGrid;
Splitter1: TSplitter;
SoftDetailGrid: TAdvStringGrid;
ImageList: TImageList;
IdSchedulerOfThreadPool1: TIdSchedulerOfThreadPool;
IdAntiFreeze1: TIdAntiFreeze;
TCPServer: TIdTCPServer;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btExitClick(Sender: TObject);
procedure btnSetClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure TCPServerExecute(AContext: TIdContext);
procedure UDPServerUDPRead(AThread: TIdUDPListenerThread;
AData: TIdBytes; ABinding: TIdSocketHandle);
procedure TCPServerDisconnect(AContext: TIdContext);
procedure TCPServerConnect(AContext: TIdContext);
function AddRequest(RequestRec: TRequestRec;ClientIp: string;Context: TidContext):TSoftWareRec;
end
var
f_mainForm: Tf_mainForm;
QueueClientList: TstringList;
CS: TRTLCriticalSection;
implementation
procedure Tf_mainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DeletecriticalSection(CS);
tcpserver.StopListening;
//tcpserver.IOHandler.Shutdown;
//IdSchedulerOfThreadPool1.TerminateAllYarns;
//
//
end;
procedure Tf_mainForm.FormCreate(Sender: TObject);
begin
InitializeCriticalSection(CS);
end;
procedure Tf_mainForm.FormShow(Sender: TObject);
begin
if not UdpUpdateStatus or not tcpUpdatestatus then
infoMessage('服务器端口已被占用,请重新设置端口');
end;
function Tf_mainForm.UdpUpdateStatus: boolean;
begin
try
UDPServer.OnUDPRead := UDPServerUDPRead;
UDPServer.DefaultPort := strtoint(AppUdpPort);
UDPServer.Active := true;
result := true;
except
result := false;
end;
end;
procedure Tf_mainForm.TCPServerConnect(AContext: TIdContext);
begin
showmessage(AContext.Connection.Socket.Binding.PeerIP);
end;procedure Tf_mainForm.TCPServerDisconnect(AContext: TIdContext);
begin
showmessage('disConnect');
end;
procedure Tf_mainForm.TCPServerExecute(AContext: TIdContext);
var
flag: string[1];
tmpBuffer: tIdbytes;
RequestRec: TRequestRec;
CIP,FSpecialityCaption,tmpstr,IP: string;
ClientInfo: TClientInfo;
index,softid,maxusers,linkedusers,linkingusers,i,count: integer;
SoftWareRec: TSoftWareRec;
softids: string;
stream,serverRec: Tmemorystream;
begin
AContext.Connection.Socket.CheckForDataOnSource(250);
if not AContext.Connection.Socket.InputBufferIsEmpty then
begin
stream := Tmemorystream.Create;
serverRec := Tmemorystream.Create;
AContext.Connection.Socket.ReadStream(stream);
stream.Position := 0;
if stream.Size>0 then
begin
stream.Read(flag,sizeof(flag));
EnterCriticalSection(CS);
IP :=AContext.Connection.Socket.Binding.PeerIP;
CIP := AContext.Connection.Socket.Binding.PeerIP ;
stream.Position := 0;
while stream.Position<stream.Size do
begin
if Flag = '.' then
begin
stream.Read(RequestRec,sizeof(TRequestRec));
SoftWareRec := AddRequest(RequestRec,CIP,AContext);
serverRec.WriteBuffer(SoftWareRec,sizeof(SoftWareRec));
end;
end;
index := clientList.IndexOf(CIP);
if index>-1 then
TClientInfo(ClientList.Objects[index]).ContextList.AddObject(CIP,AContext);
serverRec.Position := 0;
AContext.Connection.Socket.Write(serverRec,serverRec.Size,true);
end;
FreeAndnil(stream);
FreeAndNil(serverRec);
LeaveCriticalSection(CS);
end;
end;
function Tf_mainForm.tcpUpdatestatus: boolean;
var
port: integer;
begin
result := false;
port := strtoint(AppUdpPort)+1;
while true do
begin
try
TCPServer.DefaultPort := port;
TCPServer.Active := true;
result := true;
break;
except
inc(port,1);
end;
end;
AppTcpPort := inttostr(port);
TCPServer.TerminateWaitTime := 0;
end;
就这样,主窗体一关闭,程序就僵死了。
TCPServerExecute你这个函数里面写的有点危险
如果在EnterCriticalSection(CS);和FreeAndnil(stream);
两句话中间有异常退出的话,会导致你的临界区无法退出,这样你在关闭窗口的时候,DeletecriticalSection(CS);就会崩溃。
你用try finally括起来处理安全一些。
tcpserver.StopListening;
这个也有可能导致崩溃,你检查一下你的代码,关闭钱,把能释放的内存都释放,能断开的链接都断开。
多调试几次,应该很容易定位到错误。
你读多大的东西?