一秒钟内执行一次循环,不满一秒暂停剩下毫秒让一次循环满足一秒
注意:不是每隔一秒执行一次,是一秒执行一次
需要做一个视频播放和地图画点同步的功能,即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视频的起始时间点问题,因为很可能视频的第一秒根本就不足一秒,只有几百毫秒,如何取到这个值?