我正在尝试在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();
}
答案 0 :(得分:1)
使用此代码,您将阻止主应用程序线程。这可以解释为什么你一遍又一遍地获得相同的屏幕截图。
您需要做的是在后台线程中启动计时器,然后形成该线程将事件发送到主应用程序以截取屏幕截图。这将允许应用程序继续工作。
为此,您应该使用其中一个Timer
类。它们的工作方式略有不同,但是所有这些都应该允许您指定在计时器的每个刻度上调用的方法。
您需要将事件发送回UI以避免交叉线程问题。
答案 1 :(得分: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();
});
}
答案 2 :(得分: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();
}