无论喜欢与否,偶尔你必须为内部使用计时器的类编写测试.
比如说一个类,它接收系统可用性的报告,并在系统停机时间过长时引发事件
public class SystemAvailabilityMonitor {
public event Action SystemBecameUnavailable = delegate { };
public event Action SystemBecameAvailable = delegate { };
public void SystemUnavailable() {
//..
}
public void SystemAvailable() {
//..
}
public SystemAvailabilityMonitor(TimeSpan bufferBeforeRaisingEvent) {
//..
}
}
Run Code Online (Sandbox Code Playgroud)
我使用了一些技巧(将这些作为答案发布)但我不知道其他人做了什么,因为我对我的任何一种方法都不满意.
我想知道Timer类的精度在System.Timers中是什么,因为它是一个double(这似乎表明你可以有几分之一毫秒).它是什么?
我正在编写一个Cocoa OS X(Leopard 10.5+)最终用户程序,该程序使用时间戳来计算屏幕上显示内容的统计信息.使用重复的NSTimer运行程序时,会定期计算时间. [NSDate date]用于捕获时间戳,开始和结束.以秒为单位计算两个日期之间的差异是微不足道的.
如果最终用户或ntp更改系统时钟,则会出现问题. [NSDate date]依赖于系统时钟,因此如果它被改变,Finish变量将相对于Start变形,从而显着地搞乱了时间计算.我的问题:
1. 即使系统时钟在中途改变,如何准确计算开始和结束之间的时间(以秒为单位)?
我想我需要一个不变的参考时间点,所以我可以计算从那以后经过了多少秒.例如,系统正常运行时间.具有10.6 - (NSTimeInterval)systemUptime的一部分NSProcessInfo,它提供了系统正常运行时间.但是,这不起作用,因为我的应用程序必须在10.5中工作.
我尝试使用NSTimer创建时间计数器,但这不准确.NSTimer有几种不同的运行模式,一次只能运行一种.NSTimer(默认情况下)进入默认运行模式.如果用户开始操作UI足够长的时间,这将进入NSEventTrackingRunLoopMode并跳过默认运行模式,这可能导致跳过NSTimer激活,使其成为计算秒数的不准确方式.
我还考虑过创建一个单独的线程(NSRunLoop)来运行NSTimer秒计数器,使其远离UI交互.但我对多线程非常陌生,如果可能的话,我想远离它.此外,我不确定这是否会在CPU被另一个应用程序(Photoshop渲染大图像等等)绑定的情况下准确工作,导致我的NSRunLoop被搁置足够长的时间以使其陷入困境的NSTimer.
我感谢任何帮助.:)
基本上我想在我的项目中插入一个动态时钟.现在我正在使用dateTime控件,这很好,但它是静态的.我需要时钟来改变每秒的数字.在c#中有一个Timer控件,我可以使用它来使这个动态时钟成为可能.但是,在Silverlight 4中,我无法找到任何类型的定时器控制来构建这个动态时钟.
我不知道我是不是只是在错误的地方看,或者它是不是在我的鼻子下面,我只是错过它或者什么.此外,我认为使用定时器控制将是最好的,但如果有更好的方法,请告诉我也.
我正在使用QueryPerformanceCounter来计算一些代码.当代码开始报告时间明显错误时,我感到震惊.要将QPC的结果转换为"实际"时间,您需要除以QueryPerformanceFrequency返回的频率,因此经过的时间为:
时间=(QPC.end - QPC.start)/ QPF
重启后,QPF频率从2.7 GHz变为4.1 GHz.我认为实际硬件频率没有改变,因为运行程序的挂钟时间没有变化,尽管使用QPC报告的时间确实发生了变化(下降了2.7/4.1).
MyComputer-> Properties显示:
英特尔(R)奔腾(R)4 CPU 2.80 GHz; 4.11 GHz; 1.99 GB的RAM; 物理地址扩展
除此之外,该系统似乎工作正常.
我将尝试重新启动以查看问题是否清除,但我担心这些关键性能计数器可能会在没有警告的情况下变为无效.
更新:
虽然我很欣赏答案,特别是链接,但我没有受影响的芯片组,也没有自己的CPU时钟.根据我的阅读,QPC和QPF基于PCI总线中的定时器,不受CPU时钟变化的影响.在我的情况下奇怪的是QPF报告的FREQUENCY变为不正确的值,并且在MyComputer - > Properties中也报告了这种变化的频率,我当然没有写.
重新启动修复了我的问题(QPF现在报告正确的频率),但我认为如果你打算使用QPC/QPF,你应该在信任它之前对另一个计时器进行验证.
在我的应用程序中,我使用计时器来检查RSS提要中的更新,如果找到新项目,我会弹出一个自定义对话框来通知用户.当我手动运行检查时,一切都很好,但是当自动检查在计时器Elapsed事件中运行时,不会显示自定义对话框.
首先是这是一个线程问题?(我假设这是因为手动和自动检查都使用相同的代码).
当我运行自动检查时,是否必须从Timers Elapsed事件处理程序调用运行检查的方法?
我的自定义对话框类中是否需要执行某些操作?
编辑:这是一个winforms应用程序.
以下是代码的示例.(请不要在此代码示例中指出语法错误,这只是一个简单的示例,而不是真正的代码).
public class MainForm : System.Windows.Forms.Form
{
//This is the object that does most of the work.
ObjectThatDoesWork MyObjectThatDoesWork = new ObjectThatDoesWork();
MyObjectThatDoesWork.NewItemsFound += new NewItemsFoundEventHandler(Found_New_Items);
private void Found_New_Items(object sender, System.EventArgs e)
{
//Display custom dialog to alert user.
}
//Method that doesn't really exist in my class,
// but shows that the main form can call Update for a manual check.
private void Button_Click(object sender, System.EventArgs e)
{
MyObjectThatDoesWork.Update();
}
//The rest of …Run Code Online (Sandbox Code Playgroud) 我有一个在一个方法中运行TimerTask的服务,它必须每秒计数并在一段时间后执行某些操作.我的服务正常工作,当我启动服务中的方法时,计时器开始每隔一秒(1000毫秒)打勾.问题是,当设备屏幕关闭时,我的计时器有时停止并且计数不正确.我可以在日志文件中看到计时器停止15秒,然后运行5秒,然后再次停止...当设备连接到计算机时,计时器始终正常工作,当我从计算机断开设备时会出现此问题.
这是我的服务:
public class MyService extends Service {
private String TAG = getClass().getName();
public void count() {
Log.i(TAG, "Service Count Method Start");
int counter;
Timer mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
Log.i(TAG, "Timer count value : " + counter);
if (!someCondition) {
counter++;
if (DefaultApplication.notOnDisplayTime >= 180) {
Log.d(TAG, "APPLICATION REACHED TIME LIMIT!");
someCondition = true;
} else
someCondition = false;
} else {
counter = 0;
}
}
}, 0, 1000);
}
@Override …Run Code Online (Sandbox Code Playgroud) 我怎么能停止System.Threading.Timer它的回叫方法.我引用了MSDN,但找不到任何有用的东西.请帮忙.
如何handler.postDelayed()使用按钮暂停计时器.所以当我再次点击相同的按钮时,handler.postDelayed()计时器应该恢复.
handler.postDelayed(counterz, 60);
Run Code Online (Sandbox Code Playgroud) 我很抱歉这个问题,但我已经阅读了很多东西,似乎我没有得到如何制作计时器.所以我发布了我的代码:
from PyQt4 import QtGui, QtCore
from code.pair import Pair
from code.breadth_first_search import breadth_first_search
import functools
class Ghosts(QtGui.QGraphicsPixmapItem):
def __init__(self, name):
super(Ghosts, self).__init__()
self.set_image(name)
def chase(self, goal):
pos = Pair(self.x(), self.y())
path = breadth_first_search(pos, goal)
while not path.empty():
aim = path.get_nowait()
func = functools.partial(self.move_towards, aim)
timer = QtCore.QTimer()
QtCore.QTimer.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("func()"))
timer.start(200)
def move_towards(self, goal):
self.setPos(goal.first(), goal.second())
Run Code Online (Sandbox Code Playgroud)
我试图让物体每200ms朝着它的目标前进.我试过没有自己它给了我同样的错误:
QObject.connect(QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'bytes'
QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'bytes' …Run Code Online (Sandbox Code Playgroud)