调度程序计时器冻结WPF

时间:2012-08-06 10:45:31

标签: c# wpf user-interface freeze dispatchertimer

我正在为AR Drone(四旋翼无人机)设计一个3 DOF控制应用程序..我正在使用多个PID控制器来控制UAV ..这些控制器是通过使用调度程序计时器类实现的。例如在开始时程序我初始化调度程序计时器,如:

        timer_yaw = new DispatcherTimer();
        timer_yaw.Interval = new TimeSpan(0, 0, 0, 0, 45);
        timer_yaw.Tick += new EventHandler(timer_yaw_tick);

一旦用户按下GUI上的按钮,该计时器就会被触发。

        timer_yaw.Start();
在timer_yaw_tick中的

我做了一些处理:

    private void timer_yaw_tick(object sender, EventArgs e)
      {
            // drone commands and stuff ... basically a PD controller
            DroneData data = droneControl.NavigationData;
            PV_yaw = data.Psi;

            SP_yaw = angle;

            Error_yaw = SP_yaw - PV_yaw;

            if (Error_yaw >= 0)
                yaw_pd = 0.5f;
            else if (Error_yaw < 0)
                yaw_pd = -0.5f;


            Derivative_yaw = (Error_yaw - PreError_yaw) / Dt_yaw;

            Output_yaw = (Kp_yaw * Error_yaw) + (Kd_yaw * Derivative_yaw);

            PreError_yaw = Error_yaw;

            Output_yaw = Math.Round(Output_yaw, 1, MidpointRounding.AwayFromZero);

            Output_yaw = Output_yaw * 1000;

            t_PD_yaw = Convert.ToInt32(Output_yaw);

            // this t_PD_yaw is then sent to the drone via WiFi to make required adjustment

        }

现在在我的应用程序中,大约有7个这样的计时器正在运行,它们以不同的时间间隔触发....(计时器持续时间大多以所有计时器的毫秒数为单位)

我面临的问题是我的代码有时运行正常,但有时应用程序完全冻结,即没有任何反应......它真的让我疯了,我似乎无法弄清楚问题......我是使用正确的计时器为工作???

帮助真的很感激.. 日Thnx

1 个答案:

答案 0 :(得分:0)

您很可能使用与主UI线程相关的默认Dispatcher,并且DispatcherTimer连接到Default Dispatcher - 您只是通过大量工作重载UI Thread Dispatcher队列。

一个有用的测试 - 只需测量开始时的ed timer_yaw_tick()方法的执行时间以及以下内容:

// start
var watch = Stopwatch.StartNew();

// end
watch.Stop();

// see value of the watch.ElapsedMilliseconds property

我建议使用System.Threading.Timer类进行定期作业调度,并将UI控件更新分派给UI线程使用Dispatcher.Invoke() / Dispatcher.BeginInvoke()