2

ラジオボタンをフォームの左から右に移動するスレッドを作成しました。これは実行されますが、アプリケーションがブロックされます。フォームを移動できません。何もありません (これがスレッドを作成し、同時に複数のことを行う理由だと思いました) これが私のコードです。と尋ねた。前もって感謝します

    private void moveRight( )
    {
        radioButton1.Left++;
    }
    private void moveLeft()
    {
        radioButton1.Left--;
    }
    public void run()
    {
        while (true)
        {
            while (radioButton1.Left != this.ClientSize.Width - 10)
            {
                if (InvokeRequired)
                {
                    Invoke(new MethodInvoker(moveRight));
                }
                else
                {
                    moveRight();
                }
            }
            while (radioButton1.Left != 10)
            {
                if (InvokeRequired)
                {
                    Invoke(new MethodInvoker(moveLeft));
                }
                else
                {
                    moveLeft();
                }
            }
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        t = new Thread(new ThreadStart(run)); 
        t.Start();
    }
4

2 に答える 2

7

コントロールを呼び出すとInvoke、提供されたコードを UI スレッドで実行するように指示されます。

それを考えると、あなたのコードは新しいスレッドを開始し、そのスレッドでUIスレッドに永遠に実行される一連のコードを実行するように指示します.

これで、UI スレッドがブロックされている理由がわかったと思いますか?

プライマリ while ループをバックグラウンド スレッド (つまり、呼び出し内ではない) に配置し、呼び出しを特に UI を更新するコードの小さなブロックにInvoke制限する必要があります。Invoke

于 2013-03-15T19:39:12.727 に答える
0

さて、あなたのアプローチにはいくつかの問題があります。

  1. スレッド内のコードは決して終了しません..無限ループがあります
  2. スレッドを作成していても、UI スレッドですべてを実行しています (Invoke を使用)。

これら 2 つの組み合わせは、基本的に UI スレッドを無限にブロックしていることを意味します。

基本的に、これは:

while (true)
{
    while (radioButton1.Left != this.ClientSize.Width - 10)
    {
        moveRight();
    }
    while (radioButton1.Left != 10)
    {
        moveLeft();
    }
}

終わらない。また、UI スレッドで呼び出されるため、実際には何もレンダリングされずに、コントロールの左座標を更新するだけで、UI は無期限にブロックされます。

于 2013-03-15T19:39:46.500 に答える