当前位置:编程学习 > C#/ASP.NET >>

C+ 用线程刷帧,有时候很卡,会延迟.

        private void showDraw()
        {
            while (true)
            {
                //当不需要刷帧时进入死循环
                if (iGetBallState == null || idThread == 0)
                    continue;
                if (idThread == 1)
                {
                    double t = time;
                    Color color = Color.Green;
                    if(iGetBallState.setTime(ref t))
                        color = Color.Red;
                    else
                        time += 1.0 / 25;         //每秒25帧
                    double x = iGetBallState.getX();
                    double y = iGetBallState.getY();
                    label_angle.Invoke(td);
                    ball2dView.drawShow(x, y, color);
                    Thread.Sleep(4);
                }
            }

我用计时器做也一样.可能是消息队列引起的延迟,不知道如何解决,谢谢大家.... --------------------编程问答-------------------- 标题打错了,是C#. --------------------编程问答--------------------  Thread.Sleep(4);
换成
Application.DoEvents();


--------------------编程问答--------------------
引用 2 楼  的回复:
 Thread.Sleep(4);
换成
Application.DoEvents();

那样就没有将线程休眠4毫秒了? 那样的话跟直接去掉Thread.Sleep(4);有什么区别?这个方面真有点不懂,求指导... --------------------编程问答-------------------- 问题还是没解决呀,还是有点卡跟延迟. --------------------编程问答-------------------- if...continue这句话是多余的。。。 --------------------编程问答-------------------- 来个大神帮忙解决下... --------------------编程问答-------------------- 再顶一下~还是没解决... --------------------编程问答-------------------- label_angle.Invoke(td);
ball2dView.drawShow(x, y, color);
------------------------------------
这两句不要出现在线程中,最好通过中间数据和UI进行交互,比如你在线程中通过lock后改变某object
,在UI中timer定时lock去读object,然后进行绘制,这样不会阻塞你的线程。
-----------------------------------------------------------------------
if (iGetBallState == null || idThread == 0)
  continue;
---------------------------------------------
像这种continue也最好不要直接出现,最好先sleep(50),然后再continue; --------------------编程问答-------------------- 刷帧一般会有帧率,一般是一个定时器类型的,你可以用线程模拟一个定时器
            int tick1,tick2;
            while (IsWork)
            {
                tick1 = Environment.TickCount;
                if (tick1 - lastTick > interval)
                {
                    lastTick = tick1;
                    OnTick();//做自己的事情
                }
                tick2 = Environment.TickCount;
                if (tick2-lastTick <interval)
                    Thread.Sleep(200);
            }
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,