计时器故障
本文关键字:故障 计时器 | 更新日期: 2023-09-27 18:02:05
我正试图在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();
}
使用这些代码,您将阻塞主应用程序线程。这就解释了为什么你一次又一次地得到同样的屏幕截图。
您需要做的是在后台线程中启动计时器,然后形成该线程向主应用程序发送事件以进行屏幕截图。这将允许应用程序继续工作。
为此,您应该使用一个可用的Timer
类。它们的工作方式略有不同,但都应该允许您指定在计时器的每个刻度上调用的方法。
您需要将事件发送回UI,以避免跨线程问题。
您应该使用定时器并在单独的线程中运行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();
});
}
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();
}