c#winform,内存一直增长,直到内存溢出

zhqiao87 2011-12-02 01:08:59
static WeakReference wr = new WeakReference(null);
private void SetTheCsOnlineSight()
{
try
{
if (!isReult)
{
return;
}
IntPtr hscrdc = GetWindowDC(csHwnd);//调用api
Rectangle rect = new Rectangle();
GetClientRect(csHwnd, ref rect);//调用api获得窗口信息
Graphics g = wr.Target as Graphics; //Graphics.FromHdc(hscrdc);
int height = 0;
if (g == null)
{
g = Graphics.FromHdc(hscrdc);
wr.Target = g;
}
if (rdWindow.Checked)
{
//窗口化时需要加上任务栏高度
height = rect.Height / 2 + (Screen.PrimaryScreen.Bounds.Height - Screen.PrimaryScreen.WorkingArea.Height) + u;
}
if (rdAllScreen.Checked)
{
height = rect.Height / 2 + u;
}
g.DrawEllipse(new Pen(color), rect.Width / 2 + l, height, w, h);//准星大小
g.FillEllipse(new SolidBrush(color), (rect.Right - rect.Left) / 2 + l, height, fw, fh);//填充为实型
}
catch { }
finally
{
GC.Collect();
}
}

改成弱引用还是会内存溢出,求高手解答,在线等.
...全文
1260 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjp1234airen4385 2011-12-02
  • 打赏
  • 举报
回复
GetProcessWorkingSetSize()
SetProcessWorkingSetSize()
把这两个函数在c#里定义了,然后调用看看。

另外,如果你是在别的窗口上画图,一定要找到别的程序的句柄,
EndHandle := GetCurrentProcess();
就是这句话,必须是别的程序的进程句柄。


你现在光释放你程序的资源,所以会出错
mjp1234airen4385 2011-12-02
  • 打赏
  • 举报
回复
在windows下释放资源,用这个。

//此处为释放内存资源,去掉试试看?
EndHandle := GetCurrentProcess();
if GetProcessWorkingSetSize(EndHandle, currentMinWorkingSetValue, currentMaxWorkingSetValue) then
begin
SetProcessWorkingSetSize(EndHandle, currentMinWorkingSetValue, currentMaxWorkingSetValue);
end;
  • 打赏
  • 举报
回复
http://baike.baidu.com/view/1080548.htm
wsxqaz 2011-12-02
  • 打赏
  • 举报
回复
你画原的算法在那里?PI可是无穷不循环小数哦!不要忘了,你自己要画多少圆?
zhqiao87 2011-12-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zanfeng 的回复:]
.net的程序为什么要这么用。
graphics g=this.creategraphics();就可以了。
[/Quote]我这个是要在指定的窗口上画圆,并不是程序本身上的窗口,所以才Graphics.FromHdc(hscrdc);
zhqiao87 2011-12-02
  • 打赏
  • 举报
回复
我这个是要在指定的窗口上画圆,并不是程序本身上的窗口,所以才Graphics.FromHdc(hscrdc);
zhqiao87 2011-12-02
  • 打赏
  • 举报
回复
系统API呀
只是那个画圆的,内存一直增长,最后就内存溢出
足球中国 2011-12-02
  • 打赏
  • 举报
回复
.net的程序为什么要这么用。
graphics g=this.creategraphics();就可以了。
足球中国 2011-12-02
  • 打赏
  • 举报
回复
::closehandle(hscrdc );VC下面用这个。
marsh.free(hscrdc );
wsxqaz 2011-12-02
  • 打赏
  • 举报
回复
你调用的API是非托管的么?如果是他是不是提供了清理方法让你调用?

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧