为何随着不断的连续抓图,服务器端的系统资源会变得越来越少?请帮忙!(100分)

  • 主题发起人 主题发起人 chinazyk
  • 开始时间 开始时间
C

chinazyk

Unregistered / Unconfirmed
GUEST, unregistred user!
请教为何随着不断的连续抓图,服务器端的系统资源会变得越来越少?请帮忙!
服务器端代码如下:
procedure TfmSpySvr.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
tempText : String;
begin
tempText := socket.ReceiveText;
if tempText='getImage' then Socket.sendtext(getImage()) //发送图象大小
else if tempText='okok' then //客户端已准备好接收图象
begin
memorystream.Position:=0;
Socket.SendStream(memorystream); //发送JPG图象
end;
end;

function TfmSpySvr.getImage():string;
var
bitmap : TBitMap;
desktopCanvas : TCanvas;
jpegpic : TJpegImage;
begin
bitmap:=tbitmap.Create;
jpegpic:=tjpegimage.Create;
desktopCanvas:=tcanvas.Create; //以下代码为取得当前屏幕图象
try
desktopCanvas.Handle:=getdc(hwnd_desktop);
with bitmap do
begin
width:=screen.Width;
height:=screen.Height;
canvas.CopyRect(canvas.cliprect,desktopCanvas,desktopCanvas.cliprect);
end;
jpegpic.Assign(bitmap); //将图象转成JPG格式
jpegPic.CompressionQuality := BmpQuality ; //图象质量
jpegPIc.Compress;
memorystream:=tmemorystream.Create; //初始化流memorystream,
jpegpic.SaveToStream(memorystream); //将JPG图象写入流中
memorystream.Position:=0;
result:=inttostr(memorystream.size);
finally
jpegpic.free;
BitMap.Free;
DesktopCanvas.Free;
releaseDc(handle,hwnd_Desktop);
end;
end;
 
问题出在设备DC句柄没有被释放和缺少了一句 [red]memorystream.free [/red](释放内存流)

releaseDc(0,DesktopCanvas.handle);
DesktopCanvas.Free;


 
只是memorystream没有释放吧;
关于DesktopCanvas.handle是否要释放,表示怀疑。
 
to 活着VIVA
但是,若抓图完毕memorystream.free 则提示出错,曾在大富翁中看到介绍说不能memorystream.free
应直到程序运行结束才可以memorystream.free ,不然会出错。
 
出错信息:
Invalid pointer operation
 
我忘了上面的程序中 memorystream 是关联到 发送函数的,SORRY

解决方法:
把 memorystream 声明为 公共变量,,

在 FormOncreate 中 建立实例 memorystream:=tmemorystream.Create ;
在窗体DESTROY 的时候释放 memorystream.free

因此你的抓图函数必须改成:
function TfmSpySvr.getImage():string;
var
bitmap : TBitMap;
desktopCanvas : TCanvas;
jpegpic : TJpegImage;
begin
bitmap:=tbitmap.Create;
jpegpic:=tjpegimage.Create;
desktopCanvas:=tcanvas.Create; //以下代码为取得当前屏幕图象
try
desktopCanvas.Handle:=getdc(hwnd_desktop);
with bitmap do
begin
width:=screen.Width;
height:=screen.Height;
canvas.CopyRect(canvas.cliprect,desktopCanvas,desktopCanvas.cliprect);
end;
jpegpic.Assign(bitmap); //将图象转成JPG格式
jpegPic.CompressionQuality := BmpQuality ; //图象质量
jpegPIc.Compress;
[red]memorystream.CLEAR[/red];
jpegpic.SaveToStream(memorystream); //将JPG图象写入流中
memorystream.Position:=0;
result:=inttostr(memorystream.size);
finally
jpegpic.free;
BitMap.Free;
DesktopCanvas.Free;
releaseDc(handle,hwnd_Desktop);
end;
end;

楼上所说的不用 释放 DesktopCanvas.handle 有道理,,不过我发觉程序连续工作 15个小时
以后,,内存使用会增加 2M ,,不知道为什么,但释放 DesktopCanvas.handle 以后就OK
 
to 活着VIVA
仍然要请教您,按照您的方法,首次抓图成功,以后抓图出现错误,提示如下:
Access violation address 00411FE9 in module 'server.exe'. Read of address
FFFFFFFF.
 
你查看一下你的程序里面 是不是存在有两个 memorystream:=tmemorystream.Create

或 memorystream.free, 如果发现在抓图函数里有的话,,请删掉,
 
to 活着VIVA
非常感谢您一直的帮助,请接受积分,但有一问题仍想请教,有时
(其实很经常)抓图会出现乱屏现象,比如屏幕只接收一半正常,下一部分就显示
错位,图像混乱,接着就不能继续抓图。Why?,程序哪里须改进或在抓图过程中,
须注意哪些问题。谢谢!


 
出错信息:
Invalid pointer operation 是如何产生的?
 
后退
顶部