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();
--------------------编程问答--------------------
那样就没有将线程休眠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#