WPF开启Thread线程仿真,点击暂停后仿真速度变快

zzzj-ovo 2018-08-21 10:47:13
//仿真开始
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增加的速度变快,导致前台画面效果再暂停后再次开始刷新频率明显变快。
求问什么原因,变快对项目没有影响,但是算是个使用体验的问题,因为之后想设置改变速度的功能,与这里的现象发生了冲突。
...全文
185 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨易夕 2018-08-21
  • 打赏
  • 举报
回复
BeginInvoke也是通知UI进行异步更新,这个时间更不好固定。即使你线程停下来了,UI更新也不会停。
晨易夕 2018-08-21
  • 打赏
  • 举报
回复
你暂停之后连Sleep都没有了,线程死循环好吗
zzzj-ovo 2018-08-21
  • 打赏
  • 举报
回复
我是使用bIsStartDiagramSimu = true;bIsPuaseDiagramSimu = false;两个字段控制仿真开始暂停的。
xuzuning 2018-08-21
  • 打赏
  • 举报
回复
如果从不 暂停,会是怎样的表现
zzzj-ovo 2018-08-21
  • 打赏
  • 举报
回复
引用 6 楼 qq_28194303 的回复:
[quote=引用 4 楼 FoxOnTheRoof 的回复:]
[quote=引用 2 楼 qq_28194303 的回复:]
你暂停之后连Sleep都没有了,线程死循环好吗

我这里暂停只是这个循环内部不进入if条件,循环还是继续,因为下次开始还保持在暂停时的状态。循环内部if (iSimuStartSecondTime <= iSimuEndTime)后面的else才是结束进程的触发条件。[/quote]
循环是继续了,但是连个Sleep(0)都没有,陷入死循环。[/quote]
那我应该怎么控制界面刷新速度?我试了把Sleep(50)放在while的大括号里也没用
晨易夕 2018-08-21
  • 打赏
  • 举报
回复
引用 4 楼 FoxOnTheRoof 的回复:
[quote=引用 2 楼 qq_28194303 的回复:]
你暂停之后连Sleep都没有了,线程死循环好吗

我这里暂停只是这个循环内部不进入if条件,循环还是继续,因为下次开始还保持在暂停时的状态。循环内部if (iSimuStartSecondTime <= iSimuEndTime)后面的else才是结束进程的触发条件。[/quote]
循环是继续了,但是连个Sleep(0)都没有,陷入死循环。
zzzj-ovo 2018-08-21
  • 打赏
  • 举报
回复
引用 2 楼 qq_28194303 的回复:
你暂停之后连Sleep都没有了,线程死循环好吗

我这里暂停只是这个循环内部不进入if条件,循环还是继续,因为下次开始还保持在暂停时的状态。循环内部if (iSimuStartSecondTime <= iSimuEndTime)后面的else才是结束进程的触发条件。
zzzj-ovo 2018-08-21
  • 打赏
  • 举报
回复
引用 3 楼 qq_28194303 的回复:
BeginInvoke也是通知UI进行异步更新,这个时间更不好固定。即使你线程停下来了,UI更新也不会停。

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

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧