运动模拟程序假死

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();
}
...全文
614 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编程能力的科研人员与工程技术人员,特别适合从事机械臂控制、轨迹规划、多机器人协同等方向的硕士、博士研究生及相关领域研究人员。; 使用场景及目标:①掌握基于雅可比伪逆法的机械臂逆运动学求解原理与实现方法;②理解双臂系统在笛卡尔空间中协同轨迹规划的机制;③分析并优化轨迹跟踪过程中的误差收敛性能;④为多机器人系统在复杂动态环境下的高精度协同控制提供算法设计与仿真验证支持。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,按照文档目录循序渐进地学习,重点关注算法实现细节、仿真参数设置与结果分析部分,同时可进一步探索将智能优化算法或深度学习方法引入轨迹规划与误差补偿的研究方向。

111,128

社区成员

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

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

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