问题描述
注意:不是每隔一秒执行一次,是一秒执行一次需要做一个视频播放和地图画点同步的功能,即A暂停了,地图画点也暂停,A播放地图画点也播放。画点要比较精确的卡在A的每一秒上。现在地图画点是一定能在一秒钟之内完成的。我选来的视频播放privatevoidButtonPlayClick(objectsender,EventArgse){vlcControl_Main.Play();if(!isPlay){//开始走地图画点方法……………………}elseif(isPlay&&isSuspend){isSuspend=false;}}//暂停privatevoidButtonPauseClick(objectsender,EventArgse){vlcControl_Main.Pause();if(isPlay){isSuspend=true;}}//终止privatevoidButtonStopClick(objectsender,EventArgse){vlcControl_Main.Stop();if(isPlay){isStop=true;}}我原来的地图画点的for循环(这里的线程是另起了一个)foreach(varitemincargpslist){try{DateTimebt=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视频的起始时间点问题,因为很可能视频的第一秒根本就不足一秒,只有几百毫秒,如何取到这个值?
解决方案
解决方案二:
建议用stopwatch
解决方案三:
写个定时器,每隔1Snew个线程出去!
解决方案四:
引用1楼feixuyue的回复:
建议用stopwatch
看了一下还不错,但是我这边还需要一秒钟就reset一下,同时new一个timer结合一下?还是?
解决方案五:
引用3楼izumilen的回复:
Quote: 引用1楼feixuyue的回复:
建议用stopwatch看了一下还不错,但是我这边还需要一秒钟就reset一下,同时new一个timer结合一下?还是?
这些操作建议放到thread中去开始操作前,调用stopwatch.start操作结束后,调用stopwatch.stop从stopwatch.Elasped.TotalMilliseconds来判断后续需要sleep多长时间为了保证线程很很快响应操作,线程中sleep的时间相应要断一些,否则用户体验不好
解决方案六:
开线程。判断视频播放的位置即时间轴能精确到毫秒最好保存一个时间a线程Sleep可以调整为1判断2对比现在视频的时间和保存的时间a是否在同一秒是则继续循环不是则绘制且把当前视频时间给保存到a。
解决方案七:
不要使用自己构想的sleep来进行所谓的同步。