0

首先,对不起我的英语不好。

我必须几乎实时地绘制一条曲线。为此,我使用: - 一个用于堆栈点的线程 - 一个用于取消堆栈点的线程 - 以及对我来说是一种黑盒的“图形线程”,我只能通过带有Invoke方法的窗口调度程序来访问它。

当我记录调用 Dispatcher.Invoke 的开始和结束之间的时间时,我看到提前期为 3 到 110 毫秒。在有效绘图方法的开始和结束之间,我看到前置时间从 3 到 55 毫秒?!!?我不明白我怎么能浪费这么多时间,为什么我的时间如此随机,以及我如何才能快速而直接地做到这一点。(就像我使用堆栈一样,由于这些巨大的时间,堆栈经常溢出,导致应用程序崩溃: S)

UnStack线程循环:

while (exRunningFlag)
{
    lock (myLock)
    {                        
        while ( stackingListPoint.Count > 0)
        {
           LOG
           this.Dispatcher.Invoke(new Action(() =>
                    {
                        LOG                                   
                            graph.AddPoint(this.stackingListPoint.Dequeue());                                        
                        LOG
                    }), System.Windows.Threading.DispatcherPriority.Send);
                    LOG                                
            }
        }
    }                    
    Thread.Sleep(3);
}


public void AddPoint(System.Windows.Point pt)//Data
{            
    int resNeedResize = needResize(pt);   
// ------ rare case, only when need to redraw all curves. This is not relative to my weird delay
    if (resNeedResize != 0)
    {
        ReDraw(resNeedResize);
        return;
    }
// ----
    currentPt = ConversionDataPtToGraphPt(pt);
    if ((lastPt.X != -1) && (lastPt.Y != -1))
    {     
            g = CreateGraphics();                   
            g.DrawLine(pen_Courbe, lastPt, currentPt);
            g.Flush(); 
    }
    lastPt = currentPt;
    ListPointCollection.Last().Add(pt);
}

感谢您能给我带来的任何帮助,或者如果您看到我错过了一些相关的东西:S。

PS:对不起那些已经看到法语帖子的人:p

4

2 回答 2

0

作为替代策略:一次绘制所有线段,然后在可见性或不透明度上为每个线段添加动画。下面的代码绘制了一条虚线,一次一段。动画将提供比自己进行线程更好的计时行为。

for (int i = 0; i < 5; i++)
{
    Line l = new Line();
    l.X1 = i*50;
    l.Y1 = 50;
    l.X2 = i*50+40;
    l.Y2 = 50;
    l.Stroke = new SolidColorBrush(Colors.Black);
    l.StrokeThickness = 3;

    // All lines are drawn right away, just not visible. The animations fade them 
    // in one by one.
    l.Opacity = 0;
    DoubleAnimationUsingKeyFrames opanim = new DoubleAnimationUsingKeyFrames();
    opanim.KeyFrames.Add(new LinearDoubleKeyFrame(0 , TimeSpan.Zero));
    opanim.KeyFrames.Add(new LinearDoubleKeyFrame(0, TimeSpan.FromSeconds(i + 1)));
    opanim.KeyFrames.Add(new LinearDoubleKeyFrame(1, TimeSpan.FromSeconds(i + 2)));

    l.BeginAnimation(Line.OpacityProperty, opanim);

    MyCanvas.Children.Add(l);
}
于 2012-08-29T08:21:45.430 回答
0

切换线程涉及开销,它不是免费操作,并且可能有些不可预测。这完全取决于操作系统如何分配时间片。你必须确保你的代码足够可靠来处理这个问题。

请记住:Windows 不是实时操作系统。

于 2012-08-28T13:18:40.107 回答