1

メインスレッドを遅らせずに関数内で遅らせる最も簡単な方法は何ですか?
これは私がやろうとしていることであり、これに似ています:

    private void FallingToggle(bool a)
    {
        a = true;
        Thread.Sleep(1000);
        a = false;
    }

しかし、プログラム全体がフリーズすることがわかりました。
これを回避する方法はありますか?または、これにアプローチするより簡単な方法はありますか?

4

2 に答える 2

6

あなたのコメントに応えて、あなたがやろうとしていることを達成する方法はたくさんあります。

1 つの方法は、アクションが初めて発生した時刻を記録することです (これは を使用して実現できますDateTime.Now)。その後、記録された時間の 1 秒以内に後続のアクションが発生した場合は、すぐに戻ります。例:

DateTime lastActionTime = DateTime.Now;

// ...

if ((DateTime.Now - lastActionTime).Milliseconds < 1000)
{
    // Too soon to execute the action again
    return;
}

// Do whatever the action does...

これを行う別の方法として、ボタンを 1 秒間無効にしたい場合はTimer、.NET Framework にはいくつかのタイマーがあり、ここでは Winforms バージョンを使用しています)。アクションが発生したら、ボタンまたは他の UI 要素を無効にしてからTimer、1 秒間隔で を開始します。タイマーが切れたら、UI 要素を再度有効にして、ユーザーがアクションを再度実行できるようにします。例:

// In a constructor or something
timer = new System.Windows.Forms.Timer();
timer.Interval = 1000; // 1000 milliseconds
timer.Tick += (s, e) => 
{
    button.Enabled = true;
    timer.Stop();
};

// ...

void OnButtonClick()
{
    button.Enable = false;
    timer.Start();

    // Do whatever the button does...
}

後者は GUI で使用するもので、前者はゲームなどで使用できます。

于 2012-06-15T04:12:16.730 に答える
0

これが方法です..

a = true;新しいスレッドを開始した後の関数呼び出しイベントで。そして、置きます

Thread.Sleep(1000);
    a = false;  

新しいスレッドで。

これが最も簡単な方法だと思います。

于 2012-06-15T04:11:19.480 に答える