Stopwatch.GetTimeStamp导致stackoverflow错误?

时间:2011-02-10 18:58:08

标签: c# stopwatch

如果我是正确的,我应该肯定在使用Stopwatch.GetTimeStamp时不会出现堆栈溢出错误,尤其是在启动程序后才会出现。

这是我的代码:

if (currentTicks >= lastTicks + interval)
        {
            lastTicks = currentTicks;
            return true;
        }

currentTicks被Stopwatch.GetTimeStamp()放入。这段代码在一个无限调用的方法中(我用它来控制FPS)。有人有什么想法吗?

编辑: 主表单代码:

    Game game;

    public Form1()
    {
        InitializeComponent();
        game = new Game(Stopwatch.Frequency / 45);
        MainLoop();
    }

    public void MainLoop()
    {
        if (game.DrawStuff(Stopwatch.GetTimestamp()))
        {
            Invalidate();
        }

        MainLoop();
    }`

然后,游戏类:

    public long lastTicks { get; set; }

    public double interval { get; set; }

    public Game(double Interval)
    {
        interval = Interval;
    }

    public bool DrawStuff(long currentTicks)
    {
        if (currentTicks >= lastTicks + interval)
        {
            lastTicks = currentTicks;
            return true;
        }

        else
        {
            return false;
        }
    }

在“if(currentTicks> = lastTicks + interval)”上停止。我可以看到currentTicks的值是30025317628568.其他所有内容都无法评估。

2 个答案:

答案 0 :(得分:4)

你正在递归地调用MainLoop(又名infinite recursion),这意味着你正在溢出call stack。 GetTimeStamp在这里是一个红鲱鱼。

从内部删除对MainLoop的调用,只使用标准while循环:

while (game.DrawStuff(Stopwatch.GetTimestamp()))
{
    Invalidate();
}

答案 1 :(得分:3)

我猜测发布的代码是调用currentTickslastTicks甚至interval的属性的getter的一部分。

所以问题是关于使用适当的Caps属性。