1

「更新」していないように見える C#.NET の単純なラベルがあります。アプリケーションの最初の初期値のみが表示されます。次のコードでは、「score」変数は更新されませんが、messagebox.show ダイアログが呼び出されたときに正しい値が表示されます。スコア値は別のスレッドで変更されますが、呼び出しとクロス スレッド フォーム制御の問題ではないと思います (label6 が作成されたスレッドでこのコードを呼び出しているため)。

何が解決策になるか知っている人はいますか?Application.DoEvents() メソッドを無駄に試しました。また、label6.Text = score 行の後に配置すると、label6.Update() も label6.Refresh() も機能しないようです。

Player は、スコア値を public int として保持する、私が作成したクラスです。

    public Form1()
    {
        InitializeComponent();
        createGame();
    }
    public void createGame()
    {
        InitializeComponent();
        drawThread = new Thread(draw);  
        MessageBox.Show(player.score);
        label6.Text = player.score;
    }
    public void draw()
    {
        //do drawing, change player.score value
        //end thread
    }
    public void button_click()
    {
        if(firstrun)
            drawThread.Start()
        else{
            createGame()
            drawThread.Start()
        }

    }

編集 (コメントから): これは WinForms アプリケーションです。label6.Text = score 行は、Visual Studio によって生成された Form.Designer コードでインスタンス化される以外に、label6 が呼び出される唯一のインスタンスです。

4

2 に答える 2

2

Refresh()ラベルで行うだけです。

label6.Refresh();
于 2012-04-16T18:54:48.997 に答える
1

あなたのコードで私が見る

drawThread = new Thread(draw);

しかし、ボタンをクリックすると呼び出すdraw.Start()ので、レンダリングスレッドがまったく開始されていないと思います! 使うべきではありませんdrawThread.Start()か?
詳細: メインとは異なるスレッドからグラフィカル コントロールのプロパティにアクセスすることはできません。使用する必要がありますInvoke...

ここに問題があります:

  1. drawThread = new Thread(draw);
    MessageBox.Show(player.score);

    これらの行で 2 番目のスレッドが開始され、MessageBox がすぐに表示されます (2 番目のスレッドはおそらくまだ終了していません)。

  2. label6.Text = player.score;
    MessageBox を閉じると、次の行が実行されます。2 番目のスレッドが終了し、すでにスコアが更新されている場合は、期待どおりの結果が得られます。2 番目のスレッドがまだ実行されている場合、ラベルには以前のスコアが表示されます。

したがって、2 番目のスレッドが何を行うかを知らなければ、コードが正しいかどうかはわかりません。
私の意見ではlabel6.Text、2 番目のスレッドInvokeが終了したときに ( を使用して) 更新する必要があります。そうでない場合、なぜ 2 番目のスレッドを使用しているのですか?
通常、スレッドを使用して、メイン スレッド (フォームの更新とユーザー入力の処理を処理する) をブロックせずに長時間実行するため、必要に応じてこれらのスレッドからプロパティを更新する必要があります。BackgroundWorker
の 使用について考えてみてください。

于 2012-04-16T20:59:36.753 に答える