新建了一个线程,如何在线程结束后获取它的执行时间?

解决方案 »

  1.   

    var   
          ct,et,kt,ut:_filetime;   
          systime:_systemtime;   
      begin   
          GetThreadTimes(new.Handle,ct,et,kt,ut);   
          filetimetosystemtime(ct,systime);   
          Memo1.Lines.Add('create   '+format('%2d-%2d-%2d   %2d:%2d:%2d',[systime.wyear,systime.wmonth,systime.wday,systime.whour,systime.wminute,systime.wsecond]));   
        
      注:systime得到的是格林威治时间
      

  2.   

    用GetThreadTimes方法是可以得到线程的开始时间的,可是结束时间得不到啊,老是得到“1601-1-1 0: 0: 0 ”
    ,难道直接用土方法,在线程建立和结束时分别记录当时的时间到变量中?
      

  3.   

    在线程Create的事件里记录时间值,在线程结束的finally里块里再纪录一个时间。通过比较这两个值来获得。或者你建立结构:
    TThreadParam = packed record
      START_TIME: TDatetime; //开始时间
      END_TIME: TDatetime; //结束时间
    end;在Create时由主线程调用后写入START_TIME,然后在线程的onTermilate事件里再取一次时间,写入到时间结构里END_TIME,相减后就得到了执行的时间差了。
      

  4.   

    正如上面所说的,当线程开始的时候记录一下时间,在线程结束之后,再次记录,两次相减就可以得到时间差。
    如果时间差很小的话,可以考虑用浮点的形式记录,如:
    Format('%9.8f',[TimeNow2-TimeNow1])//TimeNow2和TimeNow1分别表示两次的时间记录
      

  5.   

    GetThreadTimes就可以,lpExitTimePoints to a FILETIME structure that receives the exit time of the thread. If the thread has not exited, the content of this structure is undefined. 
      

  6.   

    function FileTimeToDateTime(const AFileTime: TFileTime): TDateTime;
    var
      vSystemTime: TSystemTime;
      vLocalFileTime: TFileTime;
    begin
      FileTimeToLocalFileTime(AFileTime, vLocalFileTime);
      FileTimeToSystemTime(vLocalFileTime, vSystemTime);
      Result := SystemTimeToDateTime(vSystemTime);
    end; { FileTimeToDateTime }procedure TForm1.Button1Click(Sender: TObject);
    var
      vCreationTime, vExitTime, vKernelTime, vUserTime: TFileTime;
    begin
      GetThreadTimes(GetCurrentThread,
        vCreationTime, vExitTime, vKernelTime, vUserTime);
      Memo1.Lines.Add(DateTimeToStr(FileTimeToDateTime(vCreationTime)));
      Memo1.Lines.Add(IntToStr(Int64(vExitTime) * 100 div 1000000000)); //单位为100纳秒,一纳秒=十亿分之一秒
      Memo1.Lines.Add(IntToStr(Int64(vKernelTime) * 100 div 1000000000));
      Memo1.Lines.Add(IntToStr(Int64(vUserTime) * 100 div 1000000000));
    end;