相关疑难解决方法(0)

CPU友好的无限循环

编写无限循环很简单:

while(true){
    //add whatever break condition here
}
Run Code Online (Sandbox Code Playgroud)

但这会破坏CPU的性能.此执行线程将尽可能多地从CPU的电源中获取.

降低对CPU影响的最佳方法是什么?添加一些Thread.Sleep(n)应该可以解决问题,但为Sleep()方法设置高超时值可能表示对操作系统的应用程序无响应.

假设我需要在控制台应用程序中每分钟执行一次任务.我需要继续Main()在"无限循环"中运行,而计时器将触发将完成工作的事件.我想保持Main()对CPU的最小影响.

你有什么方法可以建议.Sleep()可以,但正如我已经提到的,这可能表明操作系统没有响应.

后期编辑:

我想更好地解释一下我在寻找什么:

  1. 我需要一个控制台应用程序不是Windows服务.控制台应用程序可以使用Compact Framework模拟Windows Mobile 6.x系统上的Windows服务.

  2. 只要Windows Mobile设备运行,我需要一种方法让应用程序保持活动状态.

  3. 我们都知道控制台应用程序运行只要其静态Main()函数运行,所以我需要一种方法来阻止Main()函数退出.

  4. 在特殊情况下(例如:更新应用程序),我需要请求应用程序停止,因此我需要无限循环并测试某些退出条件.例如,这就是为什么Console.ReadLine()我没用.没有退出条件检查.

  5. 关于上面,我仍然希望Main()函数尽可能地对资源友好.让我们确定检查退出条件的函数的指纹.

.net c# console-application infinite-loop

53
推荐指数
2
解决办法
5万
查看次数

.NET中的高分辨率计时器

我想对我的代码进行一些基本的分析,但发现C#中的DateTime.Now只有大约16毫秒的分辨率.必须有更好的时间保留我尚未找到的构造.

.net profiling timer

33
推荐指数
3
解决办法
2万
查看次数

Converting MIDI ticks to actual playback seconds

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?

midi

14
推荐指数
2
解决办法
3万
查看次数

Windows 7计时功能 - 如何正确使用GetSystemTimeAdjustment?

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)

c++ windows timing windows-7-x64

10
推荐指数
1
解决办法
1万
查看次数

如何将定时器分辨率从C#设置为1 ms?

我使用过这个工具,发现我的Windows Server 2008 R2 Standard的分辨率为15毫秒,而Windows 8的分辨率为1毫秒.

我宁愿在Windows Server 2008 R2上将Timer Resolution设置为1 ms,因为我正在运行低延迟软件.

我发现了这篇msdn文章,但它没有解释如何从C#程序更改Timer分辨率.我怎么做?

c# timer windows-server-2008-r2

9
推荐指数
2
解决办法
1万
查看次数

System.Threading.Timer vs System.Threading.Thread.Sleep resolution - .NET Timer不使用系统时钟分辨率

问题: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)

.net c# multithreading scheduling timer

9
推荐指数
2
解决办法
2933
查看次数

Task.Delay的准确性

我正在使用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%.如果用户具有少量处理器核心,则这将是非常不足的.

task-parallel-library windows-runtime win-universal-app

7
推荐指数
1
解决办法
2686
查看次数

为什么Tkinter中的这种形状会慢慢更新?

尝试在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)

python tkinter tkinter-canvas

6
推荐指数
1
解决办法
738
查看次数

Windows API中提供了哪些定期计时器对象?

在研究用于获取比.NET定时器对象提供的15毫秒的分辨率更好(见选项/sf/ask/262082271/)我正在查看Windows提供的不同计时器对象.我发现了以下内容:

Windows API中是否还有其他计时器类型?

winapi timer

5
推荐指数
1
解决办法
3504
查看次数

C#计时器性能

美好的一天!

我试图让我的应用程序每秒调用一次函数n次.我为此目的使用System.Timers.Timer(我通过将其间隔设置为1000/n ms使其每秒过期n次).我得到的每秒最大呼叫数是65.我已经尝试使用System.Threading.ThreadPool.QueueUserWorkItem,每次定时器到期时我都尝试启动新的线程.好吧,它开始时的前几秒每秒100次呼叫,然后减慢到65.

我甚至尝试不使用计时器,并使用Thread.sleep,因为它在这里的一个帖子中被建议:它根本没有帮助.

顺便说一下,我曾经在Java(SchedulerExecutorService)中做过类似的事情,我每秒最多有1000个调用没有问题.

还有什么可以帮助我解决问题?


更新:

谢谢大家,我在这里找到了解决方案:

.NET Framework的多媒体计时器

他们使用winmm.dll函数实现Timer类,它对我来说非常适合.

c# timer

5
推荐指数
0
解决办法
761
查看次数