我想将高性能事件计时器(HPET)用于分析工具,以便快速进行高精度测量.timeGetTime在1ms时没有提供足够的分辨率,而QueryPerformanceCounter每次读取的速度比我想要的慢得多.我在研究这个问题时遇到了HPET,但我看不到任何关于如何实现它的样本.
那么我可以直接使用它(组装很好),还是我必须依赖Win32 API中内置的多媒体/高性能计时工具?
我在asp.net网站上使用以下代码.
在应用程序init上,我调用一次InitializeTimer().
代码的目标是每小时运行一次DoWork()(每小时1次).
我还希望代码在每个循环的不同时间执行,所以我添加了随机部分.
我得到的结果是werid,我找不到解释为什么会发生.
代码在2小时后执行该功能,然后在2小时后再执行,然后在3小时后,然后在2小时后再执行2小时.****
谁能解释一下原因?
using System.Timers;
....
private static random = new Random();
....
public static void InitializeTimer()
{
tTimer = new Timer();
tTimer.AutoReset = true;
tTimer.Interval = TimeSpan.FromHours(1.0).TotalMilliseconds;
tTimer.Elapsed += new ElapsedEventHandler(ClassName1.tMailer_Elapsed);
tTimer.Start();
}
private static void tTimer_Elapsed(object sender, ElapsedEventArgs e)
{
tTimer.Interval += random.Next(-5, 5);
DoWork();
}
Run Code Online (Sandbox Code Playgroud)
更新:
请不要发布"使用Windows服务"或"预定任务".我的问题是以下代码我不是在寻找更好的选择.此外,在此测试(10小时),网站流量很大,iis池没有重启!
基于以下MSDN:(http://msdn.microsoft.com/en-us/library/system.timers.timer.interval.aspx)
如果在定时器启动后设置了间隔,则重置计数.例如,如果将间隔设置为5秒,然后将Enabled属性设置为true,则计数将在Enabled设置时开始.如果在计数为3秒时将间隔重置为10秒,则在Enabled设置为true后,Elapsed事件将首次提升13秒.
是否有可能重新设置已用功能的间隔是导致问题的原因?
这意味着当调用tTimer_Elapsed函数时,计数是1小时(最小几毫秒),我的代码是"tTimer.Interval + = random.Next(-5,5);" 正在向Interval添加另一个小时?
timer.Interval = 5000;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
Run Code Online (Sandbox Code Playgroud)
"timer_Tick"方法是在新线程中启动还是仍然在创建它的线程中?
我想setTimeLimit()在R中掌握并且我的经验导致了几个相关的问题,所以也许根本问题是:这是如何真正起作用的?(我一直在寻找evalWithTimeout()的R.utils,以及,它可能适合我的目的稍微好一点,但它是建立在此功能).
以下是我想弄清楚的关键事项:
它如何监控经过的时间?即它似乎插入流控制,所以它是如何做到的?能够拥有"后台"流程很酷,可用于报告状态,检查点等.
我可以确定触发前剩余的时间吗?我意识到我可以将它包装起来并在某处保存在调用点(即输出proc.time())附近消耗的已用时间和CPU时间.但是,这个功能已经在某处存储了这些功能,我想知道在哪里,或者至少知道如何确定剩余的时间.
如果R控制台空闲,是否可以做一些有用的事情?能够监控elapsed.time()并且cpu.time()非常有用.我希望能够监视R何时处于空闲状态,但似乎需要修改它需要提交或完成命令.而且,仅输出错误不会触发后续操作.(也许我需要更多关注evalWithTimeout.)
帮助信息表明它可以适用于C或Fortran,但不提供示例.有关如何做到这一点的任何建议?
基本上当我们应用一些间隔即5秒时我们必须等待它.
是否可以立即应用间隔和执行定时器,不等待5秒?(我的意思是间隔时间).
任何线索?
谢谢!!
public partial class MainWindow : Window
{
DispatcherTimer timer = new DispatcherTimer();
public MainWindow()
{
InitializeComponent();
timer.Tick += new EventHandler(timer_Tick);
this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
}
void timer_Tick(object sender, EventArgs e)
{
MessageBox.Show("!!!");
}
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
timer.Interval = new TimeSpan(0, 0, 5);
timer.Start();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Timer from Timers命名空间.当PC进入睡眠状态或休眠状态时,计时器会发生什么?
我的计时器设置为6小时延迟.
在这些情况下会发生什么.
1)定时器从0小时开始,立即进入休眠/休眠状态.然后PC在第5小时醒来.我的计时器会在接下来的1小时后或接下来的6小时后点火吗?
2)定时器从0小时开始,立即进入睡眠/休眠状态.然后PC在第7小时醒来.一旦PC唤醒,我的计时器会立即开机吗?或者它会"错过"一次并在接下来的5小时内开火?从PC唤醒时间或之前的"错过"事件开始计算直到下一个事件?
简而言之,我需要.Net中的精确计时器 - 精确到毫秒 - 这意味着,如果我告诉它在10ms通过时发射事件,它必须这样做,+ -1ms.内置的.Net Timer类似乎具有+ -16ms的精度,这对我的应用来说是不可接受的.
我发现这篇文章http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer,它提供了一个完全符合我需要的计时器代码(甚至更多 - 具有精确度,以微秒为单位) .
但问题是,OnTimer等效似乎是在另一个线程中执行的.所以,如果我添加一些代码,请说:
label1.Text = "Hello World";
Run Code Online (Sandbox Code Playgroud)
我会得到一个例外,因此我必须像这样写它:
Invoke( new MethodInvoker(() =>{label1.Text = "Hello World";}));
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这是因为OnTimer事件是从计时器的线程触发的 - 时间过去直到有足够的时间超过Interval,然后触发下一个OnTimer事件..Net Timer没有这样的问题 - 在.Net Timer的OnTimer中,我可以自由地修改控件的成员.
问题:我应该更改什么,以便我的计时器将在主线程中运行它的OnTimer事件?添加"Invoke"是唯一的选择吗?
在我的Android应用程序中,我运行一个计时器并在其他一些事件上取消它:
class MyTimerTask extends TimerTask {
override boolean cancel() {
...
}
override void run() {
...
}
}
...
Timer t = new Timer();
t.schedule(new MyTimerTask(),...)
...
t.cancel();
Run Code Online (Sandbox Code Playgroud)
我期待t.cancel()能够自动调用MyTimerTask的cancel()方法.但是从不调用该方法.
我想知道这两种方法之间究竟有什么不同,以及为什么第二种方法不能自动调用.
我目前正在尝试为我的精灵套件游戏实现一个计时器,但我没有让它工作.计时器的初始值始终保持不变.
我假设我需要以某种方式/某处更新标签,但我不知道如何和在哪里:?我不明白这一点.有任何想法吗?
这是我的GameScene类中的代码
let levelTimerLabel = SKLabelNode(fontNamed: "Chalkduster")
var levelTimerValue: Int = 500
var levelTimer = NSTimer()
func startLevelTimer() {
levelTimerLabel.fontColor = SKColor.blackColor()
levelTimerLabel.fontSize = 40
levelTimerLabel.position = CGPoint(x: size.width/2, y: size.height/2 + 350)
addChild(levelTimerLabel)
levelTimer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("levelCountdown"), userInfo: nil, repeats: true)
levelTimerLabel.text = String(levelTimerValue)
}
func levelCountdown(){
levelTimerValue--
}
Run Code Online (Sandbox Code Playgroud) 我想在响应原生应用程序(如时钟)中显示当前时间(MM/DD/YY hh:mm:ss),并且每秒都获得更新,我尝试使用新的Date()并将其设置为状态,但是时间不要除非我刷新页面,否则不会更新.我也尝试在render()中使用setInterval函数,它确实有更新,但它对CPU来说很昂贵.有没有一个很好的方法来实现这个功能?
state = {
curTime: null,
}
render(){
setInterval(function(){this.setState({curTime: new Date().toLocaleString()});}.bind(this), 1000);
return (
<View>
<Text style={headerStyle.marginBottom15}>Date: {this.state.curTime}</Text>
</View>
);
}
Run Code Online (Sandbox Code Playgroud)