1

クリックすると定期的にアクションを実行するボタンをwpf vs 2010で作成しようとしています。このサイトや他のサイトでさまざまな同様の問題をたくさん見てきましたが、問題は関数を呼び出そうとしていることですkinect からスクリーンショットを取得し、タイマーを機能させることができますが、フリーズし続けるため、2.5 秒間隔で 10 個の異なるスクリーンショットを取得するのではなく、同じスクリーンショットを何度も取得しています。現時点では、ここで見つけたいくつかのヒントに従って、ボタンの代わりにチェックボックスを使用しています。

    private void checkBox1_Checked_1(object sender, RoutedEventArgs e)
    {

        Stopwatch stopwatch = new Stopwatch();

        // Begin timing
        stopwatch.Start();

        // Do something
        for (int i = 0; i < 60000; i++)
        {
            Thread.Sleep(3);
        }

        // Stop timing
        stopwatch.Stop();

        take_motions();
    }
4

3 に答える 3

1

このコードを使用すると、メイン アプリケーション スレッドがブロックされます。これで、同じスクリーンショットが何度も表示される理由が説明できます。

バックグラウンド スレッドでタイマーを開始し、そのスレッドからメイン アプリケーションにイベントを送信してスクリーンショットを取得する必要があります。これにより、アプリケーションは作業を続行できます。

これを行うには、Timer利用可能なクラスの 1 つを使用する必要があります。それぞれの動作はわずかに異なりますが、タイマーの各ティックで呼び出されるメソッドを指定できるようにする必要があります。

クロススレッドの問題を回避するために、イベントを UI に送り返す必要があります。

于 2013-03-02T13:29:48.643 に答える
1

タイマーを使用take_motions();して、別のスレッドで実行する必要があります。

aTimer = new System.Timers.Timer(10000);

// Hook up the Elapsed event for the timer.
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

// Set the Interval to 2 seconds (2000 milliseconds).
aTimer.Interval = 2000;
aTimer.Enabled = true;

private void checkBox1_Checked_1(object sender, RoutedEventArgs e)
{
  //here call timer start or stop
}

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    ThreadPool.QueueUserWorkItem(delegate
   {
     take_motions();
   });
}
于 2013-03-02T13:36:29.650 に答える
0

WPF には、UI スレッドで実行されるときに UI クロススレッドの問題を回避する特殊なタイマー クラスがあります。それはDispatcherTimerクラスです:

private DispatcherTimer timer;

public MainWindow()
{
    InitializeComponent();

    timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2.5) };
    timer.Tick += timer_Tick;
}

private void timer_Tick(object sender, EventArgs e)
{
    // take screenshot here
}

private void checkBox_Checked(object sender, RoutedEventArgs e)
{
    timer.Start();
}

private void checkBox_Unchecked(object sender, RoutedEventArgs e)
{
    timer.Stop();
}
于 2013-03-02T15:31:31.597 に答える