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

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视频的起始时间点问题,因为很可能视频的第一秒根本就不足一秒,只有几百毫秒,如何取到这个值?
...全文
384 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

110,534

社区成员

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

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

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