下面的代码是通过一个while循环来读取缓冲区中的数据来实现接受数据的(ctNonBlocking),但是接收数据的时候CPU的占用率达到了100%,经过检查是WHILE循环造成的!由于接收网络包的是速度比CPU的速度慢的多,所以绝大部分时间循环是在空转的,也就是CPU在空转!请高人指点一下,帮我将这段代码优化一下!或给点建议!
procedure TdmClient.DownLoadsFile(ASubCmd: Word);
var
ReceiveSize,TotalSize,ActualRcvFileSize:Integer;
Rec:Pointer;
FileStream:TFileStream;
ResHd:TResHeader;
FileName1:String;
FileName2:String;
begin
FillChar(ResHd,NRESH_LEN,0);
self.ChkDir(Universal.DOWNLOAD_PATH);
FileName1:=Universal.APP_PATH+Universal.DOWNLOAD_PATH+IntToStr(ASubCmd);
FileStream:=TFileStream.Create(FileName1,fmCreate or fmOpenWrite);
try
if self.cskClient.Socket.ReceiveBuf(ResHd,NRESH_LEN)<>NRESH_LEN then
begin
FileStream.Free;
Exit;
end;
TotalSize:=ntohl(ResHd.DataLen);//要下载的文件长度
while FileStream.Size<TotalSize do
begin
ReceiveSize:=Min(TotalSize-FileStream.Size,self.cskClient.Socket.ReceiveLength);
if ReceiveSize > 0 then
begin
Rec:=AllocMem(ReceiveSize);
ActualRcvFileSize:=self.cskClient.Socket.ReceiveBuf(Rec^,ReceiveSize);
FileStream.Write(Rec^,ActualRcvFileSize);
FreeMem(Rec);
end;
delay(300);
end;
finally
FileStream.Free;
end;
end;
procedure TdmClient.DownLoadsFile(ASubCmd: Word);
var
ReceiveSize,TotalSize,ActualRcvFileSize:Integer;
Rec:Pointer;
FileStream:TFileStream;
ResHd:TResHeader;
FileName1:String;
FileName2:String;
begin
FillChar(ResHd,NRESH_LEN,0);
self.ChkDir(Universal.DOWNLOAD_PATH);
FileName1:=Universal.APP_PATH+Universal.DOWNLOAD_PATH+IntToStr(ASubCmd);
FileStream:=TFileStream.Create(FileName1,fmCreate or fmOpenWrite);
try
if self.cskClient.Socket.ReceiveBuf(ResHd,NRESH_LEN)<>NRESH_LEN then
begin
FileStream.Free;
Exit;
end;
TotalSize:=ntohl(ResHd.DataLen);//要下载的文件长度
while FileStream.Size<TotalSize do
begin
ReceiveSize:=Min(TotalSize-FileStream.Size,self.cskClient.Socket.ReceiveLength);
if ReceiveSize > 0 then
begin
Rec:=AllocMem(ReceiveSize);
ActualRcvFileSize:=self.cskClient.Socket.ReceiveBuf(Rec^,ReceiveSize);
FileStream.Write(Rec^,ActualRcvFileSize);
FreeMem(Rec);
end;
delay(300);
end;
finally
FileStream.Free;
end;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货