Delphi测试线程的时间

  在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没有提供获取线程时间的手段

时间: 2024-10-13 01:48:50

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

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

学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时间. TThread-简单的开始 在Delphi的VCL中封装了一个TThread类用于多线程的开发,这样比较符合面向对象的思想,同时又可以提

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

有时候,我们会遇到一些跟系统当前时间相关的需求,例如: 只有开学季才允许录入学生信息 只有到了晚上或者周六才允许备份博客 注册满 3 天的用户才允许进行一些操作 某用户在 24 小时内被禁止发言 很显然,要实现这些功能的代码多多少少要用到 DateTime.Now 这个静态属性,然而要使用单元测试或者集成测试对上述需求进行验证,往往需要采用一些曲线救国的方法甚至是直接跳过这些测试,这是因为在 .Net 中,DateTime.Now 通常难以被 Mock .这时候我就要夸一夸 Angular 的测

分析线程池源码测试线程池

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * 线程池测试类 */ public class TestThreadPool { public static void main(String[] args) { // 实例化线程池对象 corePoolSize--线程池

值得剖析的pthread_create测试线程

/* * pthread.c: * Tiny test program to see whether POSIX threads work. */ static const char rcsid[] = "$Id: pthread.c,v 1.4 2005/10/26 22:56:05 chris Exp $"; #include <sys/types.h> #include <errno.h>#include <pthread.h>#include

线程控制时间的随笔(实例)

1 package kk; 2 import java.util.*; 3 import java.awt.EventQueue; 4 import java.text.DecimalFormat; 5 import java.text.SimpleDateFormat; 6 import java.util.Scanner; 7 import java.util.Timer; 8 import java.util.TimerTask; 9 10 import javax.swing.JOpti

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

有些场景的.NET程序,不容易设置断点,可以用下面的方法,在.NET代码中增加启动调试器的代码: if (!Debugger.IsAttached) Debugger.Launch(); .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*w

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

http://blog.sina.com.cn/s/blog_6250a9df0101kref.html 在网上查找Delphi线程池,结果发现寥寥无几. 看了半天源代码,弄得一头雾水,觉得不容易理解和使用,于是自己想写一个线程池. 什么样的线程池更好呢? 我觉得使用起来要可靠,并且一定要简单,这样才是更好的. 我写的线程池就是这样一个标准,使用非常简单,只传入自己要执行的方法就可以了, 其实大家最后就是关注自己要操作的方法,其余的交给线程池.全部源代码如下: { {单元:ThreadPoolU

异步调用,线程队列,时间,协程

异步的使用场景 爬虫: 1.从目标站点下载网页数据,本质是HTML格式字符串 2.用re从字符串中提取出你所需要的数据 #使用进程池 from concurrent.futures import ProcessPoolExecutor import requests,re,os def get_data(url): print('%s正在请求%s'%(os.getpid(),url)) response = requests.get(url) #获取网页数据包含报头 print('%s请求%s成

Python测试线程应用程序

在本章中,我们将学习线程应用程序的测试.我们还将了解测试的重要性. 为什么要测试? 在我们深入讨论测试的重要性之前,我们需要知道测试的内容.一般来说,测试是一种了解某些东西是如何运作的技术.另一方面,特别是如果我们谈论计算机程序或软件,那么测试就是访问软件程序功能的技术. 在本节中,我们将讨论软件测试的重要性.在软件开发中,必须在向客户端发布软件之前进行双重检查.这就是由经验丰富的测试团队测试软件非常重要的原因.请考虑以下几点来理解软件测试的重要性 提高软件质量 当然,没有公司想要提供低质量的软