2

Backgroundworker を使用して MONO でアプリケーションを構築しようとしています。シーケンシャル メソッドを使用すると、アプリケーションが正常に動作します。基本的に、私のアプリケーションは、ボタンをクリックすると、描画領域にいくつかの長方形を描画します。

Backgroundworker などを使用して、シーケンシャル間の実行時間の違いを比較しようとしています。

バックグラウンド ワーカーの使用に問題があります。次のコードを見てください。

    static void DoWork (object sender, DoWorkEventArgs e)
    {
        Context ct = (Context)e.Argument;
        house.DrawHouse rect = new house.DrawHouse ();
        PointD p1, p2, p3, p4;

        p1 = new PointD (55, 250);
        p2 = new PointD (65, 250);
        p3 = new PointD (65, 90);
        p4 = new PointD (55, 90);
            Gtk.Application.Invoke (delegate {
                ct.MoveTo (p1);
                ct.LineTo (p2);
                ct.LineTo (p3);
                ct.LineTo (p4);
                ct.LineTo (p1);
                ct.ClosePath ();
                ct.Color = new Color (0, 0, 0);
                ct.FillPreserve ();
                ct.Color = new Color (255, 255, 255);
                ct.Stroke ();
            });
        }   
    }

上記のコードでは、ワーカー スレッドが長方形を作成し、GUI スレッドにそれを出力させます。しかし、 ct.MoveTo (p1);でエラーをスローしています。

以下はエラーです

すぐに誰かから連絡が来ることを願っています。

4

2 に答える 2

1

そのコードを GUI スレッドで呼び出していますか? 調べるには、このツールを使用できます。

また、推測させてください。あなたはこれを Windows で実行していますね。私がこのような印象を受けたのは、Mono よりも MS.NET で AccessViolationExceptions が頻繁に発生するためです (どういうわけか、Mono ではアンマネージド ワールドとの相互運用性がそれほど厳密ではありません)。

これは時々バグで持ち出されましたが、まだ修正されていません。MS.NET では、これらの問題は通常、適切な呼び出し規則を適用することで修正されます。例はこれです、多分あなたはこれのいくつかを見逃していますか? (または Cairo のバインディング? 必ずgtk-sharp のクローンを作成し、呼び出されている DllImport を確認してください。バグを見つけて、プル リクエストを送信して修正することもできますか?)

于 2012-09-11T21:39:47.300 に答える
0

あなたは正しいです。はい、これを Windows で実行しています。あなたの最初のポイントでは、ワーカースレッドがタスクを開始し、長方形を作成し、GUI スレッドに渡して画面に印刷します。(Gtk.Application.Invoke (delegate { }); これにより、GUI スレッドに切り替わります)

次のコードを見てください。私は同じことをしていますが、ペイントの視点ではありませんが、計算に時間がかかります。時間のかかる計算はワーカー スレッドによって行われ、その結果が GUI スレッドに渡されて UI に出力されます。これは、エラーなしで完全にうまく機能しています。

void DoWork (object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    var watch = Stopwatch.StartNew ();

    for (int i = lowerLimit; i <= upperLimit; i++) {
        int j = i;
        var result = SumRootN (j);
        Gtk.Application.Invoke (delegate {
            textview15.Buffer.Text += "root " + j.ToString () + " = " + result.ToString () + Environment.NewLine;
        });
        worker.ReportProgress ((int)(((double)i / (double)upperLimit) * 100));
    }
    var time = watch.ElapsedMilliseconds;
    textview20.Buffer.Text = "Background Worker: \n execution took " + time + " MS to \n complete the execution \n SLOW & RESPONSIVE"; 
}

しかし、塗装のために同じことをすると、上に添付したエラーが表示されます。

私が間違っている場合は修正してください

返信ありがとうございます。返信を確認させていただきます。

于 2012-09-12T03:00:12.310 に答える