一秒钟内执行一次循环,不满一秒暂停剩下毫秒让一次循环满足一秒

izumilen 2014-10-20 11:24:07
注意:不是每隔一秒执行一次,是一秒执行一次
需要做一个视频播放和地图画点同步的功能,即A暂停了,地图画点也暂停,A播放地图画点也播放。画点要比较精确的卡在A的每一秒上。
现在地图画点是一定能在一秒钟之内完成的。

我选来的视频播放
private void ButtonPlayClick(object sender, EventArgs e)
{
vlcControl_Main.Play();
if (!isPlay)
{
//开始走地图画点方法
……………………
}
else if (isPlay && isSuspend)
{
isSuspend = false;
}
}
//暂停
private void ButtonPauseClick(object sender, EventArgs e)
{
vlcControl_Main.Pause();
if (isPlay)
{
isSuspend = true;
}
}
//终止
private void ButtonStopClick(object sender, EventArgs e)
{
vlcControl_Main.Stop();
if (isPlay)
{
isStop = true;
}
}

我原来的地图画点的for循环(这里的线程是另起了一个)
foreach (var item in cargpslist)
{
try
{
DateTime bt = DateTime.Now;
WaitForMapDrag();
this._manualResetEvent.WaitOne();

//当需要暂停操作时,阻止后台线程继续执行
while (isSuspend && !isStop)
{
Thread.Sleep(50);
}

if (isStop) //停止
{
isSuspend = !isStop;
isPlay = !isStop;
break;
}

WaitForMapDrag();
this._manualResetEvent.WaitOne();

//绘制轨迹
………………………
………………………
………………………

sleepseconds = (int)(1000 - (DateTime.Now - bt).Milliseconds);

Thread.Sleep(sleepseconds);
}
catch
{ }
}

这样基本能够做到不满一秒让线程暂停补足一秒,但是有几个问题。
1.每一循环要执行完才sleep,如果是暂停之后再paly,这时候线程没有sleep,导致不能和视频点同步
2.点击暂停的时候应该会执行到Thread.Sleep(50)那里面,那么之前那几行代码运行的毫秒数是否可以忽略不计
3.这样做每次都要去datetime再计算会不会导致误差越来越大
4.用System.Threading.Timer是否更好?有方法能够取到timer已经走过的剩下的毫秒数,或者timer可以暂停,计时一完就走循环?
5.顺便问一下关于vlc视频的起始时间点问题,因为很可能视频的第一秒根本就不足一秒,只有几百毫秒,如何取到这个值?
...全文
449 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
izumilen 2014-10-21
  • 打赏
  • 举报
回复
引用 1 楼 feixuyue 的回复:
建议用stopwatch
看了一下还不错,但是我这边还需要一秒钟就reset一下,同时new一个timer结合一下?还是?
「已注销」 2014-10-21
  • 打赏
  • 举报
回复
不要使用自己构想的sleep 来进行所谓的同步。
「已注销」 2014-10-21
  • 打赏
  • 举报
回复
开线程。 判断视频播放的位置 即时间轴 能精确到毫秒最好 保存一个时间a 线程Sleep可以调整为1 判断2 对比现在视频的时间和保存的时间a是否在同一秒 是 则继续循环 不是则绘制且把当前视频时间给保存到a。
xian_wwq 2014-10-21
  • 打赏
  • 举报
回复
引用 3 楼 izumilen 的回复:
[quote=引用 1 楼 feixuyue 的回复:] 建议用stopwatch
看了一下还不错,但是我这边还需要一秒钟就reset一下,同时new一个timer结合一下?还是?[/quote] 这些操作建议放到thread中去 开始操作前,调用stopwatch.start 操作结束后,调用stopwatch.stop 从stopwatch.Elasped.TotalMilliseconds来判断后续需要sleep多长时间 为了保证线程很很快响应操作,线程中sleep的时间相应要断一些, 否则用户体验不好
niekangshibendan 2014-10-20
  • 打赏
  • 举报
回复
写个定时器,每隔1S new个线程出去!
feixuyue 2014-10-20
  • 打赏
  • 举报
回复
建议用stopwatch
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

111,129

社区成员

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

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

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