在16位时代,当我们在Windows3.x下编程时,经常会用到GetTickCount()或者timeGetTime()来判断一段代码的执行时间。示例如下

var
StartTime, Total: Longint;
begin
StartTime:= GetTickCount;
{进行一些操作}
Total:= GetTickCount - StartTime;
end;

  在多线程环境下,这是很困难的,因为在执行程序中间,操作系统可能会把CPU时间片分给别的进程。所以,用上述方法测出的时间并不真实

  为了解决这个问题,Windows NT提供了一个函数GetThreadTimes(),它可以提供详细的时间信息。其声明如下

function GetThreadTimes(hThread: THandle; var lpCreationTime, lpExitTime,
lpKernelTime, lpUserTime: TFileTime): BOOL; stdcall;

  hThread参数是线程的句柄,其他参数都是变参,由GetThreadTimes()函数返回它们的值,其中:

1)lpCreationTime:线程创建的时间

2)lpExitTime:线程退出的时间。如果线程还在执行,此值无意义

3)lpKernelTime:执行操作系统代码所用的时间

4)lpUserTime:执行应用程序本身代码所用的时间

  以上四个参数都是TFileTime类型。此类型在Windows单元中声明如下

type
TFileTime = record
dwLowDateTime: DWORD;
dwHighDateTime: DWORD;
end;

  此类型的声明有些不寻常。由dwLowDateTime和dwHighDateTime组成一个64位值,代表从1601年1月1日以来的计数(单位:千万分之一秒)

  提示:因为TFileTime的长度是64位的,所以,为了进行数学运算你可以把它转换成Int64。这样,我们就可以对两个TFileTime的值比较大小,例如

if Int64(UserTime) > Int64(KernelTime) then
Beep;

  为了帮助你学会TFileTime的用法,下面的代码将演示如何把TFileTime和TDateTime相互转换

function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
var
SysTime: TSystemTime;
begin
if not FIleTimeToSystemTime(FileTime, SysTime) then
raise EConvertError.CreateFmt('FileTimeToSystemTime failed. '+ 'Error code %d', [GetLastError]);
with SysTime do
Result:= EncodeDate(wYear, wMonth, wDay) + EncodeTime(wHour, wMinute, wSecond, wMilliSeconds)
end; function DateTimeToFileTime(DateTime: TDateTime): TFileTime;
var
SysTime: TSystemTime;
begin
with SysTime do
begin
DecodeDate(DateTime, wYear, wMonth, wDay);
DecodeTime(DateTime, wHour, wMinute, wSecond, wMilliseconds);
wDayofWeek:= DayOfWeek(DateTime);
end;
id not SysTimeToFileTime(SysTime, Result) then
raise EConvertError.CreateFmt('SystemTimeToFileTime failed. ' + 'Error code %d', [GetLastError]);
end;

  

  注意:请记住函数GetThreadTimes()只适合于Windows NT/2000.如果你在Windows95/98下调用它,它总是返回False。非常不幸,Windows 95/98没有提供获取线程时间的手段

Delphi测试线程的时间的更多相关文章

  1. 转:学习笔记: Delphi之线程类TThread

    学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...

  2. 如何在 ASP.NET Core 测试中操纵时间?

    有时候,我们会遇到一些跟系统当前时间相关的需求,例如: 只有开学季才允许录入学生信息 只有到了晚上或者周六才允许备份博客 注册满 3 天的用户才允许进行一些操作 某用户在 24 小时内被禁止发言 很显 ...

  3. .NET 程序启动调试器 .NET 测试代码耗费时间

    有些场景的.NET程序,不容易设置断点,可以用下面的方法,在.NET代码中增加启动调试器的代码: if (!Debugger.IsAttached) Debugger.Launch(); .cshar ...

  4. GetThreadTimes获取其它线程cpu时间

    http://www.cnblogs.com/eaglet/archive/2009/03/11/1408809.html 鄙视下上面的垃圾博文,纯粹忽悠人 参考文章: http://blog.kal ...

  5. 学习笔记: Delphi之线程类TThread

    新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...

  6. Delphi ThreadPool 线程池(Delphi2009以上版本适用)

    http://blog.sina.com.cn/s/blog_6250a9df0101kref.html 在网上查找Delphi线程池,结果发现寥寥无几. 看了半天源代码,弄得一头雾水,觉得不容易理解 ...

  7. 分享自己做的一个指定进程以及线程长时间cpu监控的工具

    前言: 前面给大家分享过一个工作中用到的编译拷贝脚本,其实工作中还有一些其他工具的使用,今天再来分享一个自己纯手工的CPU监控的脚本.大家可以结合上篇文章与本篇文章一起学习shell. 主要实现功能: ...

  8. 怎么使用Delphi获取当前的时间,精确到毫秒

    先介绍一个可能比较常用的方法,获取当前时间 var datetime: string; begin datetime:= FormatDateTime('yyyy-mm-dd hh:mm:ss', N ...

  9. delphi中线程应用之Synchronize

    当一个线程在使用时,如果这个函数使用了Synchronize修钸的话就不允许别一个线程来调用这个函数,它的目的是避免多个子线程同时访问主线程资源.示例:procedure TTaskThread.Sh ...

随机推荐

  1. PYTHON 自动化之路 (二)

    一.python 模块的使用 模块的使用: import os #调用 os 模块 cmd_s = os.popen("dir").read() #打开路径为结果保存为cmd_sp ...

  2. NOI2005 聪聪和可可

    Sol 记忆化搜索. \(f[u][v]\) 表示聪聪在 \(u\) ,可可在 \(v\) ,聪聪抓到可可的期望. 预处理出 \(u\) 到 \(v\) 最短路径编号最小的点,记为 \(g[u][v] ...

  3. 关于linux中文乱码的问题。

    公司让人在一台装有ubuntu14.04的机器上安装net-snmp,可是这台机器的设置很让人不喜.没关系,一个个解决它. 不能连接外网,得弄一个代理. 这个好说,在可以上外网的本机上安装squid工 ...

  4. SVN钩子说明

    post-commit在提交完成,成功创建版本之后执行该钩子,提交已经完成,不可更改,因此本脚本的返回值被忽略. post-lock对文件进行加锁操作之后执行该脚本 post-revprop-chan ...

  5. powerdesigner反向

    1.Could not initial JVM不能初始化 :要求安装32位的JDK,把path指向32的安装目录 2.Non SQL Error : Could not load class orac ...

  6. Service错误

    错误日志:  Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act= ...

  7. Android常用控件

     Android 中使用各种控件(View) DatePicker - 日期选择控件 TimePicker - 时间选择控件 ToggleButton - 双状态按钮控件 EditText - 可编辑 ...

  8. ios block 导致的循环引用

    [[NSNotificationCenter defaultCenter] addObserverForName:@"UIWindowDidRotateNotification" ...

  9. Java对象排序

    java实现对象比较,可以实现java.lang.Comparable或java.util.Comparator接口 //Product.java import java.util.Date; //p ...

  10. Django~Models1

    不用数据库不用Models 省却 --------------- startapp urls +链接 view以下 ---------------- 添加Model 在project/settings ...