0

さて、私はしばらくそれをやっていて、スレッドだけを使うことにしました。シンタックスハイライトを作成していますが、通常使用されるファイルサイズでひどいパフォーマンスが得られ続けています。そこで、2つのフォームを作成しました。最初のフォームはプレーンテキストでファイルを表示し、クリックすると「openincolor」というボタンがあり、新しいスレッドを開始します。

    private void button1_Click(object sender, EventArgs e)
    {
        ColoringThread colorer = new ColoringThread(this.m_bruteView.Text);
        Thread theThread = new Thread(new ThreadStart(colorer.OpenColorWindow));
        theThread.Start();
    }

    public class ColoringThread
    {
        string text;
        public ColoringThread(string initText)
        {
            text = initText;
        }
        public void OpenColorWindow()
        {
            Form2 form2 = new Form2(text);
            form2.ShowDialog();
        }
    };

このフォームは、x行の色付けが完了するたびにメッセージを送り返したいと思います。次に、それを取得して進行状況を把握し、ユーザーに表示します。

メッセージまたはイベント(...?それを行うことができます)を最初のフォームに送信して、他の進行状況を通知するにはどうすればよいですか?

4

4 に答える 4

3

これを行う非常に簡単な方法の1つは、BackgroundWorkerを使用することです。すでに進捗状況を報告するイベントを提供しています。

于 2012-08-17T18:38:53.043 に答える
2

このようなものはどうですか?これにより、呼び出し元のクラスによってサブスクライブされているColoringThreadクラスにイベントが追加されます。

private void button1_Click(object sender, EventArgs e) {
    ColoringThread colorer = new ColoringThread(this.m_bruteView.Text);
    colorer.HighlightProgressChanged += UpdateProgress;
    Thread theThread = new Thread(new ThreadStart(colorer.OpenColorWindow));
    theThread.Start();
}

private void UpdateProgress(int linesComplete) {
    // update progress bar here
}

public class ColoringThread
{
    string text;

    public delegate void HighlightEventHandler(int linesComplete);
    public event HighlightEventHandler HighlightProgressChanged;

    public ColoringThread(string initText) {
        text = initText;
    }

    public void OpenColorWindow() {
        Form2 form2 = new Form2(text);
        form2.ShowDialog();

        int linesColored = 0;
        foreach (String line in text.Split(Environment.NewLine)) {
            // colorize line here

            // raise event
            if (HighlightProgressChanged != null)
                HighlightProgressChanged(++linesColored);
        }
    }
};
于 2012-08-17T18:50:03.887 に答える
1

オブジェクトを引数としてThread.Startに渡し、現在のスレッドと開始スレッドの間でデータを共有できます。


良い例を次に示します 。AOPを使用してC#で異なるスレッド間でデータを共有する方法は?


または、ReportProgressを持つBackgroundWorkerを使用できます

于 2012-08-17T18:40:13.160 に答える
1

必要なのは、System.Windows.Threading.DispatcherのBeginInvokeメソッドです。バックグラウンドスレッドからWPFオブジェクトを直接変更することはできませんが、デリゲートをディスパッチして変更することはできます。

派生したWindowクラスオブジェクトにはPropertyDispatcherがあるため、次のように使用します。

Dispatcher.BeginInvoke(
  DispatcherPriority.Normal,
  (status) => { StatusTextBox.Text = status },
  thestatus
);

申し訳ありませんが、現在それをテストすることができず、私がそれを行ったプロジェクトがここにありません。しかし、私はそれがうまくいくと確信しています、頑張ってください;)

更新:おっと、フォームを使用しています... WPFについて書きました、ごめんなさい。

于 2012-08-17T18:51:21.897 に答える