运动模拟程序假死

c9cad 2018-01-17 09:48:55

只是简单地画了一个矩形,绕着一个矩形框运动,每次运行2分钟不到的时候,那个小方框就不能动了,请大神们指点一下。
================================================================================================

private void button1_Click(object sender, EventArgs e)
{

Timer tmr = new Timer();
tmr.Interval = 50;
tmr.Tick += new EventHandler(tmr_Tick);
tmr.Start();
}

protected override void OnPaint(PaintEventArgs e)
{
Graphics g;
g = this.pictureBox1.CreateGraphics();
g.DrawImage(DrawImg(), new Point(0, 0));//在画板的原点画出图形
g.Dispose();
base.OnPaint(e);
}

private Image DrawImg()
{
Image img = new Bitmap(1050, 300);//定义位图
Graphics g = Graphics.FromImage(img);//创建画板
g.Clear(Color.Black);
g.DrawRectangle(Pens.White, p0.X, p0.Y, WidthT - p0.X, HeightT - p0.Y);
g.FillRectangle((Brush)Brushes.White, PX - CheW / 2, PY - CheH / 2, CheW, CheH);
g.DrawString("123", new Font("Verdana", 7), new SolidBrush(Color.White), PX - CheW / 2, PY - CheH / 2 - 13);
g.DrawString("2", new Font("Verdana", 7), new SolidBrush(Color.Black), PX - CheW / 2, PY + CheH / 2 - 13);
g.DrawImage(img, new Point(0, 0));//在画板的原点画出图形
g.Dispose();
return img;

}
void tmr_Tick(object sender, EventArgs e)
{
switch (GuiDao)
{
case 1:

PX = p0.X;
PY += speed;
if (PY>=HeightT)
{
PY = HeightT;
GuiDao = 2;

}
break;
case 2:
PX += speed;
PY=HeightT;
if (PX >= WidthT)
{
PX = WidthT;
GuiDao = 3;

}
break;

default:
break;
}

this.Invalidate();
}
...全文
603 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-01-20
  • 打赏
  • 举报
回复
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            DrawImg(g);//在画板的原点画出图形
            base.OnPaint(e);
        }

        private Image  DrawImg(Graphics g)
        {
            //g.Clear(Color.Black);
            g.DrawRectangle(Pens.White, p0.X, p0.Y, WidthT - p0.X, HeightT - p0.Y);
            g.FillRectangle((Brush)Brushes.White, PX - CheW / 2, PY - CheH / 2, CheW, CheH);
            g.DrawString("123", new Font("Verdana", 7), new SolidBrush(Color.White), PX - CheW / 2, PY - CheH / 2 - 13);
            g.DrawString("2", new Font("Verdana", 7), new SolidBrush(Color.Black), PX - CheW / 2, PY + CheH / 2 - 13);         
            g.DrawImage(img, new Point(0, 0));//在画板的原点画出图形
      }
c9cad 2018-01-20
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
其实你并不需要 Image img = new Bitmap(1050, 300);//定义位图 而是可以直接将 Graphics 传入DrawImg
能具体说一下吗?
xuzuning 2018-01-19
  • 打赏
  • 举报
回复
其实你并不需要 Image img = new Bitmap(1050, 300);//定义位图 而是可以直接将 Graphics 传入DrawImg
c9cad 2018-01-19
  • 打赏
  • 举报
回复
谢谢各位兄弟,问题已经解决,是因为img对象没有及时销毁。
  • 打赏
  • 举报
回复
timer是方法内的局部变量,估计被GC释放了吧? 你将timer定义为类内的全局变量
正怒月神 2018-01-17
  • 打赏
  • 举报
回复
tmr.Interval = 50; 你这个 50毫秒触发一次吗?
xian_wwq 2018-01-17
  • 打赏
  • 举报
回复
自行测试下timer中执行函数花费的时间大概多少 如果timer每一轮的时间都超过了interval, 而timer中的函数是不可重入的, 那结果就是不可预期
内容概要:本文提出了一种基于蒙特卡洛模拟与拉格朗日松弛法相结合的分散式优化方法,用于解决电动汽车充电站在分时电价机制下的有序充电调度问题。通过构建考虑用户充电需求与电网负荷平衡的优化模型,利用拉格朗日松弛法处理多车充电之间的耦合约束,实现去中心化的决策过程;同时引入蒙特卡洛方法模拟用户充电行为的不确定性,提升调度策略的鲁棒性。该方法有效降低了电网负荷峰谷差,提高了充电经济性与系统运行效率,为大规模电动汽车接入提供了可行的调度解决方案。; 适合人群:具备电力系统优化基础和Matlab编程能力的研究生、科研人员,以及从事智能电网、电动汽车能源管理等相关领域的工程技术人员。; 使用场景及目标:①应用于城市充电站集群的运营调度,实现削峰填谷与成本优化;②支撑电力系统需求侧管理研究,评估分时电价政策对用户充电行为的引导效果;③为多主体参与的分散式能源管理系统提供算法参考与仿真验证工具。; 阅读建议:建议读者结合提供的Matlab代码深入理解拉格朗日乘子迭代更新机制与蒙特卡洛场景生成流程,重点分析算法收敛性与不同电价策略下的调度结果差异,可通过调整用户数量、充电功率等参数进行仿真实验,以掌握模型的实际应用特性。

111,129

社区成员

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

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

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