delphi多线程之谜

构造线程

1
constructor Creat(CreateSuspended:boolean)

其中:CreateSuspended = true 构造但不唤醒 false 构造的同时即唤醒

也可以用如下方法:

  • inheried Create(CreateSuspended:boolean)//挂起线程
  • suspend//(把线程挂起次数加一) 唤醒线程
  • resum//(这个属性是吧线程挂起次数减一,当次数为0时析构(清除线程所占用的内存))
  • destroy//终止线程

取得线程的时间

1
2
3
4
5
6
7
8
GetThreadTimes()
BOOL WINAPI GetThreadTimes(
HANDLE hThread,
LPFILETIME lpCreationTime, 线程创建的时间
LPFILETIME lpExitTime, 线程退出的时间。如果线程还在执行,此值无意义。
LPFILETIME lpKernelTime, 执行操作系统代码所用的时间。
LPFILETIME lpUserTime 执行应用程序本身代码所用的时间。
);

函数返回值失败时为0,成功为不等于零的数。可用GetLastError()来取得更详细的资料

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

1
2
3
4
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} 64位数

TFileTime的长度是64位,为了进行数学运算可以把它转换为Int64。例如两个TFileTime的值比较大小:

1
If Int64(UserTime)> Int64(KernelTime) then Beep;

自己动手写和TdateTime的转换函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
procedure Func3(MyThread:TMyThead;Memo:TMemo); //计算线程时间
function FileTimeToDateTime(FileTime:TFileTime):TDateTime; //TFileTime转化成TDateTime
var
SysTime:TSystemTime;
begin
if not FileTimeToSystemTime(FileTime,SysTime) then
Raise Exception.CreateFmt('FileTimeToSystemTime failed.'+
'Error code %d',[GetLastError]);
with SysTime do
Result:=EncodeDate(wYear,wMonth,wDay)+
EncodeTime(wHour,wMinute,wSecond,wMilliseconds);
end;
var
CreateTime,ExitTime,KernelTime,UserTime:TFileTime;
begin
if GetThreadTimes(MyThread.Handle,CreateTime,ExitTime,KernelTime,UserTime) then
begin
Memo.Lines.Add('创建时间:'+DateTimeToStr(FileTimeToDateTime(CreateTime)));
Memo.Lines.Add('退出时间:'+DateTimeToStr(FileTimeToDateTime(ExitTime)));
Memo.Lines.Add('Win时间:'+DateTimeToStr(FileTimeToDateTime(KernelTime)));
Memo.Lines.Add('进程时间:'+DateTimeToStr(FileTimeToDateTime(UserTime)));
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
MyThread:TMyThead;
begin
m:=0;
MyThread:=TMyThead.Create(False);
Func2(MyThread,Memo1);
Memo1.Lines.Add('---------------');
Func3(MyThread,Memo1);
end;

热评文章