在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. Sqli-LABS通关笔录-3

    /*此时心情xxxx*/ 通过这一关卡我学习到了 1.大概的能够mysql回显错误注入的面目,可以根据报错,写出闭合语句. 加一个单引号.报错如下所示. 加了一个单引号就说 1'') LIMIT 0, ...

  2. 深入Activity,Activity启动模式LaunchMode完全解析

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53221384本文出自[DylanAndroid的博客] 在平时的开发中,我们可 ...

  3. Codeforces 727 F. Polycarp's problems

    Description 有一个长度为 \(n\) 有正负权值的序列,你一开始有一个值,每次到一个权值就加上,最少需要删掉多少数值才能到序列末尾.\(n \leqslant 750,m \leqslan ...

  4. 解决Python往MySQL插入中文时报错的问题

    今天遇到一个问题,用Python往MySQL插入数据时,若数据中包含中文会报类似下面的错误: ERROR 1366: Incorrect string value: '\xE4\xB8\xAD\xE5 ...

  5. C# 接口基础

     接口只包含方法.属性.事件或索引器的签名. 实现接口的类或结构必须实现接口定义中指定的接口成员 接口中可以包含字段吗? 第一次被问到这个问题的时候被问愣住了,只能回答:印象当中没见过在接口中定义变量 ...

  6. 关于fill_parent,match_parent和wrap_content (转载)

    fill_parent&match_parent: 在Android2.2及以上版本中,fill_parent与match_parent意思相同(其中fill_parent兼容低版本).都是尽 ...

  7. Unity3d 制作物品平滑运动

    直接贴代码了 using UnityEngine; using System; using System.Collections; using System; using DataTable; pub ...

  8. 后台子线程(非主线程)更新UI引起的警告

    一.问题描述 -(void)sendAsynchronousRequest { NSLog(@"%@",[NSThread currentThread]); [SVProgress ...

  9. 【编程题目】一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),取出其中一段,要求包含所有 N 中颜色,并使长度最短。

    40.百度研发笔试题 2)一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有 N 中颜色,并使长度最短.并分析时间复杂度与空间复杂度. 思路: ...

  10. va_list使用

    http://www.programfan.com/blog/article.asp?id=41937