Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#控制台应用程序计时器_C#_Timer - Fatal编程技术网

C#控制台应用程序计时器

C#控制台应用程序计时器,c#,timer,C#,Timer,标题说明了一切我想在我的c#游戏模拟器/应用程序中添加一个计时器,并想用一个计时器来检查这个程序的运行时间,这意味着它已经运行了多长时间,但我想让计时器向上计数,而不是向下计数,这样我就可以检查它已经加载了多少秒。我试过很多教程,但都不管用,只是出错了 我正在添加计时器,代码没有显示出来以便输入(如果你明白我的意思的话),一旦我完成了输入,它们只是错误,下面有红线 //uptime Timer timer = new Timer(); timer.Interval

标题说明了一切我想在我的c#游戏模拟器/应用程序中添加一个计时器,并想用一个计时器来检查这个程序的运行时间,这意味着它已经运行了多长时间,但我想让计时器向上计数,而不是向下计数,这样我就可以检查它已经加载了多少秒。我试过很多教程,但都不管用,只是出错了


我正在添加计时器,代码没有显示出来以便输入(如果你明白我的意思的话),一旦我完成了输入,它们只是错误,下面有红线

//uptime
        Timer timer = new Timer();
        timer.Interval = 60 * 1000;
        timer.Enabled = true;
        timer.tick();
        timer.Start();

你不想用定时器来计算正常运行时间。计时器太不可靠了,不能指望它每秒钟都准确地启动一次。因此,也可以使用一个名为GetProcessTimes()的API函数:

PInvoke的声明是:

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetProcessTimes(IntPtr hProcess, out FILETIME lpCreationTime, out FILETIME lpExitTime, out FILETIME lpKernelTime, out FILETIME lpUserTime);
将此语句放入类中

编译器查找这些类型所需的导入如下所示:

using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
using System.Runtime.InteropServices;
    private DateTime FileTimeToDateTime(FILETIME fileTime)
    {
        ulong high = (ulong)fileTime.dwHighDateTime;
        unchecked
        {
            uint uLow = (uint)fileTime.dwLowDateTime;
            high = high << 32;
            return DateTime.FromFileTime((long)(high | (ulong)uLow));
        }
    }
using System.Diagnostics;

void ShowElapsedTime()
{

        FILETIME lpCreationTime;
        FILETIME lpExitTime;
        FILETIME lpKernelTime;
        FILETIME lpUserTime;

        if (GetProcessTimes(Process.GetCurrentProcess().Handle, out lpCreationTime, out lpExitTime, out lpKernelTime, out lpUserTime))
        {
            DateTime creationTime = FileTimeToDateTime(lpCreationTime);
            TimeSpan elapsedTime = DateTime.Now.Subtract(creationTime);
            MessageBox.Show(elapsedTime.TotalSeconds.ToString());
        }
}
将FILETIME转换为DateTime的函数如下所示:

using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
using System.Runtime.InteropServices;
    private DateTime FileTimeToDateTime(FILETIME fileTime)
    {
        ulong high = (ulong)fileTime.dwHighDateTime;
        unchecked
        {
            uint uLow = (uint)fileTime.dwLowDateTime;
            high = high << 32;
            return DateTime.FromFileTime((long)(high | (ulong)uLow));
        }
    }
using System.Diagnostics;

void ShowElapsedTime()
{

        FILETIME lpCreationTime;
        FILETIME lpExitTime;
        FILETIME lpKernelTime;
        FILETIME lpUserTime;

        if (GetProcessTimes(Process.GetCurrentProcess().Handle, out lpCreationTime, out lpExitTime, out lpKernelTime, out lpUserTime))
        {
            DateTime creationTime = FileTimeToDateTime(lpCreationTime);
            TimeSpan elapsedTime = DateTime.Now.Subtract(creationTime);
            MessageBox.Show(elapsedTime.TotalSeconds.ToString());
        }
}

事实上,我们真的需要看到你的代码,以便我们帮助你。我在帖子中添加了代码,正如你所看到的,我只是做了一个简单的tmer来抓取秒数(不是加上,不是加下),但只是一个简单的计时器“一旦我完成了输入,他们只会在下面出现红线错误。”错误是什么?如果马克·贝滕肖的建议答案太难理解,也许你可以使用秒表类?阿什利-正如我在帖子中所说,这是一种不可靠的机制。计时器不能保证定期开火。事实上,他们根本就不保证开火。我不理解那种代码/程序1%,我对c语言毫无用处。只是个乞丐。datetime有什么我能做的吗?@AshleySmith,如果你是初学者,你可以使用datetime和timespan来获得正常运行时间(但秒表是专门为计时而设计的)。我怀疑你不想要微秒的精确度。请注意,这远远不是最佳实践。但一旦你变得更高级,你会发现PInvoke真的很方便。www.pinvoke.net有很多很好的例子。我用代码例子扩展了我的原始帖子。记住将所有“using”语句分组在一起。“using System.Diagnostics”语句允许我使用Process类。如果您想了解其中一些内容,请查阅“PInvoke”和我提供的GetProcessTimes()上的引用。@AshleySmith也阅读了这篇文章。关于秒表的有趣观点