1

我正在尝试在 wpf vs 2010 中创建一个按钮,单击该按钮时会定期执行一个操作,我在这个网站和其他网站上查看了大量不同的类似问题,但问题是我正在尝试调用一个函数从 kinect 截取屏幕截图,可以让计时器工作,但它会一直冻结,而不是 10 个不同的屏幕截图,间隔为 2.5 秒,我一次又一次地获取相同的屏幕截图,非常感谢任何帮助。根据我在此处找到的一些提示,目前我正在使用复选框而不是按钮。

    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类之一。它们的工作方式略有不同,但都应允许您指定在计时器的每个滴答声上调用的方法。

您需要将事件发送回 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 回答