编写无限循环很简单:
while(true){
//add whatever break condition here
}
Run Code Online (Sandbox Code Playgroud)
但这会破坏CPU的性能.此执行线程将尽可能多地从CPU的电源中获取.
降低对CPU影响的最佳方法是什么?添加一些Thread.Sleep(n)应该可以解决问题,但为Sleep()方法设置高超时值可能表示对操作系统的应用程序无响应.
假设我需要在控制台应用程序中每分钟执行一次任务.我需要继续Main()在"无限循环"中运行,而计时器将触发将完成工作的事件.我想保持Main()对CPU的最小影响.
你有什么方法可以建议.Sleep()可以,但正如我已经提到的,这可能表明操作系统没有响应.
后期编辑:
我想更好地解释一下我在寻找什么:
我需要一个控制台应用程序不是Windows服务.控制台应用程序可以使用Compact Framework模拟Windows Mobile 6.x系统上的Windows服务.
只要Windows Mobile设备运行,我需要一种方法让应用程序保持活动状态.
我们都知道控制台应用程序运行只要其静态Main()函数运行,所以我需要一种方法来阻止Main()函数退出.
在特殊情况下(例如:更新应用程序),我需要请求应用程序停止,因此我需要无限循环并测试某些退出条件.例如,这就是为什么Console.ReadLine()我没用.没有退出条件检查.
关于上面,我仍然希望Main()函数尽可能地对资源友好.让我们确定检查退出条件的函数的指纹.
我想对我的代码进行一些基本的分析,但发现C#中的DateTime.Now只有大约16毫秒的分辨率.必须有更好的时间保留我尚未找到的构造.
I want to know how to convert MIDI ticks to actual playback seconds.
For example, if the MIDI PPQ (Pulses per quarter note) is 1120, how would I convert it into real world playback seconds?
我GetSystemTimeAdjustment在Windows 7上使用该功能运行了一些测试,得到了一些我无法解释的有趣结果.正如我所理解的那样,如果系统时间定期同步,则该方法应该返回,如果是,则在哪个时间间隔以及更新它的增量(请参阅MSDN上的GetSystemTimeAdjustment函数).
从此我可以看出,如果我查询系统时间,例如GetSystemTimeAsFileTime重复使用,我应该不做任何更改(系统时钟尚未更新),或者是检索到的增量的倍数的更改GetSystemTimeAdjustment.问题一:这个假设是否正确?
现在考虑以下测试代码:
#include <windows.h>
#include <iostream>
#include <iomanip>
int main()
{
FILETIME fileStart;
GetSystemTimeAsFileTime(&fileStart);
ULARGE_INTEGER start;
start.HighPart = fileStart.dwHighDateTime;
start.LowPart = fileStart.dwLowDateTime;
for (int i=20; i>0; --i)
{
FILETIME timeStamp1;
ULARGE_INTEGER ts1;
GetSystemTimeAsFileTime(&timeStamp1);
ts1.HighPart = timeStamp1.dwHighDateTime;
ts1.LowPart = timeStamp1.dwLowDateTime;
std::cout << "Timestamp: " << std::setprecision(20) << (double)(ts1.QuadPart - start.QuadPart) / 10000000 << std::endl;
}
DWORD dwTimeAdjustment = 0, dwTimeIncrement = 0, dwClockTick;
BOOL fAdjustmentDisabled = TRUE;
GetSystemTimeAdjustment(&dwTimeAdjustment, &dwTimeIncrement, …Run Code Online (Sandbox Code Playgroud) 问题:System.Threading.Timer尽管OS时钟分辨率更精确,
为什么保持15ms的分辨率?在没有繁忙的CPU等待的情况下,实现1ms定时事件分辨率的可行方法是什么?
再次强调:在我的情况下,系统计时器的分辨率为1ms(而不是建议重复的问题).所以这不是系统计时器分辨率的问题.因此,在所谓的重复问题中没有有用的信息.
背景:
.NET似乎System.Threading.Timer 没有使用系统时钟分辨率 - 它保持了~15ms的分辨率.尽管OS时钟(例如Sleep分辨率)更加精确.
在我的盒子上(当几乎空闲且4个核心可用时):
>Clockres.exe
ClockRes v2.0 - View the system clock resolution
Copyright (C) 2009 Mark Russinovich
SysInternals - www.sysinternals.com
Maximum timer interval: 15.625 ms
Minimum timer interval: 0.500 ms
Current timer interval: 1.001 ms
Run Code Online (Sandbox Code Playgroud)
输出我的快速测试:
Sleep test:
Average time delta: 2[ms] (from 993 cases)
System.Threading.Timer test:
Average time delta: 15[ms] (from 985 cases)
Run Code Online (Sandbox Code Playgroud)
测试代码是:
private static void TestSleepVsTimer(long millisecondsDifference, int repetions)
{
TimingEventsKeeper timingEventsKeeper …Run Code Online (Sandbox Code Playgroud) 我正在使用C#/ Xaml开发Windows 10 Universal App,我正在使用等待Task.Delay(delayInMilliseconds)来暂停给定时间的方法.我的场景有点实时,因此它对时间变化非常敏感,我需要确保当我暂停一个方法让我们说8毫秒时,它会暂停8毫秒.我注意到**Task.Delay**暂停方法的实际时间跨度与传递的延迟参数不同,1到30毫秒,每次调用的"偏差"长度不同.所以,当我想睡8毫秒时,我的系统会睡眠9到39毫秒,这完全破坏了我的情景.所以,我的问题是什么是替换**Task.Delay**并获得良好精度的最佳方法?目前我使用这种方法:
public static void Delay1(int delay)
{
long mt = delay * TimeSpan.TicksPerMillisecond;
Stopwatch s = Stopwatch.StarNew();
while (true)
{
if (s.Elapsed.TotalMilliseconds > delay)
{
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它猜测它消耗了大量资源,即处理器核心的100%.如果用户具有少量处理器核心,则这将是非常不足的.
尝试在tkinter中进行简单的移动:
import tkinter as tk
class GameApp(object):
"""
An object for the game window.
Attributes:
master: Main window tied to the application
canvas: The canvas of this window
"""
def __init__(self, master):
"""
Initialize the window and canvas of the game.
"""
self.master = master
self.master.title = "Game"
self.master.geometry('{}x{}'.format(500, 500))
self.canvas = tk.Canvas(self.master)
self.canvas.pack(side="top", fill="both", expand=True)
self.start_game()
#----------------------------------------------#
def start_game(self):
"""
Actual loading of the game.
"""
player = Player(self)
#----------------------------------------------#
#----------------------------------------------#
class Player(object):
"""
The player of the game. …Run Code Online (Sandbox Code Playgroud) 在研究用于获取比.NET定时器对象提供的15毫秒的分辨率更好(见选项/sf/ask/262082271/)我正在查看Windows提供的不同计时器对象.我发现了以下内容:
Windows API中是否还有其他计时器类型?
美好的一天!
我试图让我的应用程序每秒调用一次函数n次.我为此目的使用System.Timers.Timer(我通过将其间隔设置为1000/n ms使其每秒过期n次).我得到的每秒最大呼叫数是65.我已经尝试使用System.Threading.ThreadPool.QueueUserWorkItem,每次定时器到期时我都尝试启动新的线程.好吧,它开始时的前几秒每秒100次呼叫,然后减慢到65.
我甚至尝试不使用计时器,并使用Thread.sleep,因为它在这里的一个帖子中被建议:它根本没有帮助.
顺便说一下,我曾经在Java(SchedulerExecutorService)中做过类似的事情,我每秒最多有1000个调用没有问题.
还有什么可以帮助我解决问题?
更新:
谢谢大家,我在这里找到了解决方案:
他们使用winmm.dll函数实现Timer类,它对我来说非常适合.