0

まず、私の下手な英語で申し訳ありません。

ほぼリアルタイムで曲線を描かなければなりません。これを行うには、次を使用します: - ポイントをスタックするスレッド - ポイントをアンスタックするスレッド - そして、私にとって一種のブラックボックスであり、Invoke method を使用してウィンドウDispatcherによって到達できる「グラフィック スレッド」 。

Dispatcher.Invoke への呼び出しの開始と終了の間の時間をログに記録すると、3 から 110 ミリ秒のリード タイムが表示されます。そして、効果的な描画方法の開始と終了の間に、3 から 55 ミリ秒のリード タイムが表示されます ?!!? どうすればこんなに多くの時間を無駄にできるのか、なぜこんなにランダムなタイミングが得られるのか、さらにはどうすればこれを迅速かつストレートにできるのか理解できません。 S)

アンスタック スレッド ループ:

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);
}

あなたが私にもたらすことができるどんな助けにも感謝します.

PS: フランス語でその投稿を既に見た人には申し訳ありません :p

4

2 に答える 2

0

スレッドの切り替えにはオーバーヘッドが伴います。これは無料の操作ではなく、予測がつかない場合があります。それはすべて、オペレーティング システムがタイム スライスを割り当てる方法に依存します。コードがこれを処理するのに十分な信頼性があることを確認する必要があります。

注意: Windows はリアルタイム オペレーティング システムではありません。

于 2012-08-28T13:18:40.107 に答える
0

別の方法として、すべての線分を一度に描画してから、可視性または不透明度で線分ごとにアニメーションを追加します。以下のコードは、一度に 1 つのセグメントで破線を描画します。アニメーションは、スレッド化を自分で行うよりも優れたタイミング動作を提供します。

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 に答える