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