//仿真开始
private void btnSimuStart_Click(object sender, RoutedEventArgs e)
        {
            bIsStartDiagramSimu = true;
            bIsPuaseDiagramSimu = false;
            TraDiaPasSimuThread = new Thread(new ThreadStart(DiagramPassengerSimulate));
            TraDiaPasSimuThread.IsBackground = true;
            TraDiaPasSimuThread.Start();
        }
//仿真暂停
        private void btnSimuPause_Click(object sender, RoutedEventArgs e)
        {
            bIsPuaseDiagramSimu = true;
        }
//仿真函数
private void DiagramPassengerSimulate()
        {
            while (bIsStartDiagramSimu)
            {
                if(!bIsPuaseDiagramSimu)
                {
                    if (iSimuStartSecondTime <= iSimuEndTime)
                    {
                        iSimuStartSecondTime += iSimuSecondTimeStep;
                        this.Dispatcher.BeginInvoke((Action)delegate ()
                        {
                            tbkTest.Text = iSimuStartSecondTime.ToString();
                            try
                            {
                                DrawSimuTimeLine(cvDiagramTrainRunLine);
                                DrawSimuDiagramTrainLine(cvDiagramTrainRunLine);
                            }
                            catch
                            {
                                //MessageBox.Show("里面出错");
                            }
                        });
                        Thread.Sleep(50);
                    }
                    else
                        bIsStartDiagramSimu = false;
                }               
            }   
        }
点击开始后开始仿真,但是当我暂停后再次开始时,仿真速度确变快了,步长变量 iSimuSecondTimeStep没有变化,Thread.Sleep(50)写死了。就是说 iSimuStartSecondTime增加的速度变快,导致前台画面效果再暂停后再次开始刷新频率明显变快。
求问什么原因,变快对项目没有影响,但是算是个使用体验的问题,因为之后想设置改变速度的功能,与这里的现象发生了冲突。

解决方案 »

  1.   

    我是使用bIsStartDiagramSimu = true;bIsPuaseDiagramSimu = false;两个字段控制仿真开始暂停的。
      

  2.   

    你暂停之后连Sleep都没有了,线程死循环好吗
      

  3.   

    BeginInvoke也是通知UI进行异步更新,这个时间更不好固定。即使你线程停下来了,UI更新也不会停。
      

  4.   

    我这里暂停只是这个循环内部不进入if条件,循环还是继续,因为下次开始还保持在暂停时的状态。循环内部if (iSimuStartSecondTime <= iSimuEndTime)后面的else才是结束进程的触发条件。
      

  5.   

    请问sleep的时候不是控制通知UI进行异步更新吗?
      

  6.   

    我这里暂停只是这个循环内部不进入if条件,循环还是继续,因为下次开始还保持在暂停时的状态。循环内部if (iSimuStartSecondTime <= iSimuEndTime)后面的else才是结束进程的触发条件。
    循环是继续了,但是连个Sleep(0)都没有,陷入死循环。
      

  7.   

    我这里暂停只是这个循环内部不进入if条件,循环还是继续,因为下次开始还保持在暂停时的状态。循环内部if (iSimuStartSecondTime <= iSimuEndTime)后面的else才是结束进程的触发条件。
    循环是继续了,但是连个Sleep(0)都没有,陷入死循环。
    那我应该怎么控制界面刷新速度?我试了把Sleep(50)放在while的大括号里也没用