我最近一直在构建一个错误记录应用程序,并且正在为一种准确的时间戳记输入数据.当我准确地说我的意思是每个时间戳应该相对于彼此准确(不需要同步到原子钟或类似的东西).
我一直在使用datetime.now()作为第一次尝试,但这并不完美:
>>> for i in range(0,1000):
... datetime.datetime.now()
...
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 609000) …Run Code Online (Sandbox Code Playgroud) 我正在使用java.util.Timer来安排定期任务.有一次,我想关闭它,等待它完成.
Timer.cancel()将阻止任何未来的任务运行.我如何确保当前没有任何任务正在运行(如果是的话,还是等待它们?)
我可以引入外部同步机制,但我不知道它们如何涵盖所有情况.例如,如果我在任务中的某个Monitor上进行同步,我仍然会错过任务刚刚开始执行但没有使用监视器的情况.
等待所有任务真正完成的建议做法是什么,包括当前正在运行的任务?
有没有办法以几微秒的分辨率在C#中触发事件?
我正在构建一个MIDI音序器,它需要在每个MIDI音符时触发一个事件,然后播放当时注册的任何音符.
每分钟120次,分辨率为120 ppqn(每拍脉冲/四分音符),该事件应每4.16666毫秒发射一次.现代音序器具有更高的分辨率,例如768ppqn,这将要求每651微秒触发一次事件.
我发现的短时间事件的最佳分辨率是1毫秒.我怎么能超越那个?
这个问题必须已经由任何C#MIDI音序器或MIDI文件播放器解决.也许我只是没有通过正确的角度看问题.
谢谢您的帮助.
我已经搜索了但是我找不到matlab tic/toc函数的等价物来简单地在控制台上显示程序进行处理的时间.(理想情况下,我想把tic(启动计时器)和toc(结束计时器)放在程序的任何地方.
有什么建议?
我试图通过使用计时器延迟我的方法中的事件,但我不一定了解如何使用计时器等待.
我将我的计时器设置为2秒,但是当我运行此代码时,最后一次调用运行没有2秒延迟.
Timer timer = new Timer();
timer.Tick += new EventHandler(timer_Tick); // Everytime timer ticks, timer_Tick will be called
timer.Interval = (1000) * (2); // Timer will tick evert second
timer.Enabled = true; // Enable the timer
void timer_Tick(object sender, EventArgs e)
{
timer.Stop();
}
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "first";
timer.Start();
label1.Text = "second";
}
Run Code Online (Sandbox Code Playgroud)
因此,当我单击我的按钮时,它会立即将label1显示为"second",而不是更改为"first",等待2秒,然后更改为"second".我在这里阅读了许多关于使用计时器而不是thread.sleep的线程,但我似乎无法找到/弄清楚如何实际实现它.
我需要编写一个接收事件的组件(事件具有唯一的ID).每个活动都要求我发出请求.该事件指定一个超时期限,等待来自请求的响应.
如果响应在计时器触发之前响起,那很好,我取消了计时器.如果计时器首先触发,那么请求超时,我想继续前进.
此超时时间是在事件中指定的,因此它不是常量.预期的超时时间在30秒到5分钟的范围内.
我可以看到实现这个的两种方法.
选项1似乎是最简单的解决方案,但我担心创建这么多计时器可能不是一个好主意,因为计时器可能太昂贵了.在创建大量计时器时是否存在任何陷阱?我怀疑在后台,定时器实现可能实际上是选项2的有效实现.如果这个选项是个好主意,我应该使用哪个定时器?System.Timers.Timer或System.Threading.Timer.
选项2似乎更多的工作,与选项1相比可能不是一个有效的解决方案.
更新
我期望的最大定时器数量在10000的范围内,但更有可能在100的范围内.另外,正常情况是在发射之前取消定时器.
更新2
我使用10K实例运行测试,System.Threading.Timer并System.Timers.Timer密切关注线程数和内存.System.Threading.Timer与System.Timers.Timer通过内存使用判断相比,似乎"更轻" ,并且没有为两个定时器创建过多的线程(即 - 线程池正常工作).所以我决定继续使用System.Threading.Timer.
我已经在某处读过这个答案,但我完全不明白:
我理解Windows使用curTimeAdjustment(156001 + - N)的值每curTimeIncrement(156001 100纳秒)递增时钟.但是当使用GetSystemTime读取时钟时,例程会在156001纳秒*100的时间间隔内插入以产生指示的精度吗?
有人可以试着向我解释一下吗?
是什么curTimeIncrement,curTimeAdjustment以及Windows如何做到这一点?
这对获得准确时间有什么影响?
这是真的只适用于Windows 7或其他操作系统Win8,Linux等等吗?
我创建了一个doWork()预定每天凌晨1点运行的功能,功能如下:
@Schedule(hour = "1", persistent = false)
public void doWork()
{
System.out.println("Starting .....\nTIME: " + System.currentTimeMillis());
System.out.println("this : " + this);
//Some code here, if-conditions and try/catch blocks. No loops
System.out.println("Exiting .....\nTIME: " + System.currentTimeMillis());
System.out.println("this : " + this);
}
Run Code Online (Sandbox Code Playgroud)
问题是这个函数不止一次运行,而不是按计划运行.
一旦我创建它,它就完全按预期运行(每天凌晨1:00:00).几天后,它开始在1:03:00运行(这没有任何意义,因为它是非持久性的,并且服务器中没有任何停机时间).之后,该功能开始运行不止一次,间隔间隔很短(秒差)
有谁知道可能导致这种情况的原因,或者告诉我我能做些什么来解决它?
[编辑]:环境细节
Application Server:WebSphere Application Server 8.5.5
IDE:Rational Application Developer 9.1
数据库管理系统:IBM DB2 10.1
我是Dart/Flutter的新手,想建立一个简单的应用程序,其中LinearProgressBar每秒都会更新.
没有太多的实际代码,我有以下设置工作.
一切都按预期工作,但有一个例外.当我在Android设备的后台移动应用程序时,'tick'会继续打印.
在原生Android上,当触发'onPause'事件时,我会取消我的定期计时器.
Flutter有类似的东西吗?我能找到的只是'initState'和'dispose'.但是,在将应用程序移动到后台时,不会调用Dispose.
我不希望计时器在后台继续滴答作响.
在我的研究中,我发现这个Stack Overflow问题onresume-and-onpause-for-widgets-on-flutter.它的答案建议使用TickerProviderStateMixin.
我用下面的方法.
class _BarItemState extends State<BarItem> with SingleTickerProviderStateMixin {
Ticker ticker;
num progress = 1.0;
@override
void initState() {
super.initState();
ticker = createTicker((duration) => setState(() {
debugPrint('tick');
progress = duration.inSeconds / 30;
}))
..start();
}
// other stuff omitted
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我仍然不满意.
原因是,自动收报机回调现在每隔几毫秒调用一次,而不是每秒调用一次.在我看来,这似乎是浪费资源(我不需要流畅的动画),...我是否过于复杂的事情?
即使我的用例似乎不需要它,我仍然想知道:
如何自己处理onPause/onResume事件?
我的应用程序写入一个日志文件(当前使用log4net).我想设置一个计时器和一个后台工作程序来读取日志文件并将其内容打印到我的表单中的某个控件中,同时它正在被写入.
我无法使用FileSystemWatcher类,因为它看起来很破碎:有时事件"已更改"会触发,有时则不会.它具有极低的"汇集率".
所以我创建了一个Timer和一个FileSystemWatcher.在计时器的"tick"事件中,后台工作人员完成其工作.
问题是:如何只读取自上次检查工作人员以来添加的行?
public LogForm()
{
InitializeComponent();
logWatcherTimer.Start();
}
private void logWatcherTimer_Tick(object sender, EventArgs e)
{
FileInfo log = new FileInfo(@"C:\log.txt");
if(!logWorker.IsBusy) logWorker.RunWorkerAsync(log);
}
private void logWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Read only new lines since last check.
FileInfo log = (FileInfo) e.Argument;
// Here is the main question!
}
Run Code Online (Sandbox Code Playgroud)
编辑:代码解决方案(也许有更优雅的方式?):
private void logWatherWorker_DoWork(object sender, DoWorkEventArgs e)
{
// retval
string newLines = string.Empty;
FileInfo log = (FileInfo) e.Argument;
// Just skip …Run Code Online (Sandbox Code Playgroud)