0

メイン フォーム (UI) と並行して実行されるスレッドがあります。(今のところ) 行うことは、毎秒カウンターをインクリメントすることだけです。Windows フォームでラベルを使用してカウンターの値を表示したいと考えています。それは可能ですか?次のコードを試すと、ShowValue メソッドでコンパイル エラーが発生します。バックグラウンド スレッドから呼び出すことができるように、ShowValue を「静的」と宣言する必要があります。でもそうすると「これ」が使えない。ShowValue Form1 のラベルにアクセスします。これはこれを行う正しい方法ですか?どんなヒントでも大歓迎です、ありがとう!

    private void count_secs()
    {
        while (!stopThread)
        {
            if (stopThread)
            {
                break;
            }
            num2++;                      // increment counter
            Form1.ShowValue(num2);       // display the counter value in the main Form
            try
            {
                Thread.Sleep(1000);      // wait 1 sec.
            }
            catch (ThreadInterruptedException)
            {
                if (stopThread)
                {
                    break;
                }
            }
        }
    }

次に、Form1 クラスには次のものがあります。

  public static void ShowValue(int num)
  {
        this.label7.Text = num.ToString();    
        // compiler error here: "Keyword 'this' is not valid in a static method.

  }
4

5 に答える 5

1

異なるスレッドから GUI 要素にランダムにアクセスすることはできません。問題に対する簡単な答えは、既存の構造を使用することです。

  • 頻繁にやりたいだけの場合は、Timerを使用します。時間切れになるとメインスレッド (GUI を「所有」) に通知し、そこで GUI 要素を更新できます。
  • 本当に独自のスレッドを作成したい場合は、Backgroundworkerを使用してください。GUI要素を更新できるスレッドセーフなイベントを提供します。
于 2013-05-08T07:20:51.127 に答える
1

this.label7静的メソッドでローカル変数 ( ) を参照することはできませんShowValue(int num)

メソッドは次のようになります。

public void ShowValue(int num)
  {

       if(label7.InvokeREquired)
       {
           Action a = () => ShowValue(num);
           label7.Invoke(a);
       }
       else
        this.label7.Text = num.ToString();    

  }

このコードでは、フォームへの静的呼び出しをインスタンスに置き換えます。

   private void count_secs()
    {
         var frm = new Form1(); //create instance
         frm.Show(); // show form

        while (!stopThread)
        {
            if (stopThread)
            {
                break;
            }
            num2++;                      // increment counter

            //use form instance
            frm.ShowValue(num2);       // display the counter value in the main Form
            try
            {
                Thread.Sleep(1000);      // wait 1 sec.
            }
            catch (ThreadInterruptedException)
            {
                if (stopThread)
                {
                    break;
                }
            }
        }

編集

フォームインスタンスをメソッド外に宣言したい場合がありますcount_secs()

于 2013-05-08T07:18:46.233 に答える
0

2 つの問題:

  1. this静的コンテキストからの参照は使用できません。
  2. バックグラウンド スレッドから UI を更新することはできません。

ソリューション:

  1. メソッドをインスタンスメソッドとしてマークしShowValueます (つまり、を取り除きますstatic) 。
  2. バックグラウンドワーカーを使用するか、非常によく説明されているこの質問を読んでください
于 2013-05-08T07:19:30.460 に答える