Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.01;
Скачать: CL | DM;

Вниз

помогите конвертировать время   Найти похожие ветки 

 
Koha ©   (2007-06-05 00:14) [0]

есть код на С++ но не могу перевести его на на делфи, теряю значение времени

_int64 FileTimeToQuadWord(PFILETIME ptt)
{
return(Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}

void PerformLongOperation ()
{

FILETIME ftKernelTimeStart, ftKernelTimeEnd;
FILETIME ftUserTimeStart, ftUserTirreEnd;
FILETIME ftDummy;

_int64 qwKernelTimeElapsed, qwUserTimeElapsed, qwTotalTimeElapsed;

// получаем начальные показатели времени
GetThreadTimes(GetCurrentThrcad(), &ftDurrmy, &ftDummy, &ftKernelTirrieStart, &ttUserTimeStart);

// здесь выполняем сложный алгоритм

// получаем конечные показатели времени
GetThreadTimes(GetCurrentThread(), &ftDumrny, &ftDummy, &ftKernelTimeEnd, &ftUserTimeEnd);

// получаем значении времени, затраченного на выполнение ядра и User,
// преобразуя начальные и конечные показатели времени из FILETIME
// в учетверенные слова, а затем вычитая начальные показатели из конечных
qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) - FileTimeToQuadWord(&ftKernelTimeStart);

qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeFnd) - FileTimeToQuadWord(&riUserTimeStart);

// получаем общее время, складывая время выполнения ядра и User
qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;

// общее время хранится в qwTotalTimeElapsed
}


 
Koha ©   (2007-06-05 09:17) [1]

Вот что-то подобное придумал как перевесити подобный код в делфи, но все равно не работает как надо время гдето "замыливается", если кто знает подскажите как правильно подсчитать период выполнения процесса?

Var i: Integer;
   T: PIntTime;
   KernelTimeEnd, UserTimeEnd, Dummy,KernelTimeStart,UserTimeStart: FILETIME;
   stKernelTimeEnd, stUserTimeEnd, stKernelTimeStart, stUserTimeStart: TSystemTime;
   KernelTimeElapsed,UserTimeElapsed,TotalTimeElapsed: Longint;
   DT: TDateTime;
begin

 New(T);
 memo1.Clear;
 memo1.Lines.Add(IntToStr(TimeList.count));
 T:=TimeList.Items[0];

 GetProcessTimes(GetCurrentProcess,Dummy,Dummy,KernelTimeEnd,UserTimeEnd);

 FileTimeToLocalFileTime(KernelTimeEnd,KernelTimeEnd);
 FileTimeToSystemTime(KernelTimeEnd,stKernelTimeEnd);

 FileTimeToLocalFileTime(T.KernelTimeStart,KernelTimeStart);
 FileTimeToSystemTime(T.KernelTimeStart,stKernelTimeStart);

 FileTimeToLocalFileTime(UserTimeEnd,UserTimeEnd);
 FileTimeToSystemTime(UserTimeEnd,stUserTimeEnd);

 FileTimeToLocalFileTime(T.UserTimeStart,UserTimeStart);
 FileTimeToSystemTime(T.UserTimeStart,stUserTimeStart);

 DT:=(SystemTimeToDateTime(stKernelTimeStart)-SystemTimeToDateTime(stKernelTimeEnd)+
   SystemTimeToDateTime(stUserTimeStart)-SystemTimeToDateTime(stUserTimeEnd));

 Memo1.Lines.Add("LastMetod = "+TimeToStr(DT));


 
MBo ©   (2007-06-05 09:27) [2]

function UserTime: Int64;
var
 CreationT,ExitT,KernelT, UserT : _FILETIME;
begin
 GetProcessTimes(GetCurrentProcess, CreationT, ExitT,KernelT, UserT);
 Result := Int64(UserT) div 10000;
end;


 
MBo ©   (2007-06-05 09:30) [3]

p.s. функция дает относительное время в миллисекундах


 
Koha ©   (2007-06-05 10:21) [4]

сейчас добавил еще функцию, теперь по другому выводится время.
конечное время считается но только в секундах, нехватает милесекунд
как задать формат для TimeToStr(ColapsTime), что бы выводить время с миллесекундами

function FileTimeToDateTime(ft: TFileTime): TDateTime;
 var
   ft1: TFileTime;
   st: TSystemTime;
 begin
   if ft.dwLowDateTime + ft.dwHighDateTime = 0 then
     Result := 0
   else
   begin
     FileTimeToLocalFileTime(ft, ft1);
     FileTimeToSystemTime(ft1, st);
     Result := SystemTimeToDateTime(st);
   end;
end;

Var
   T: PIntTime;
   KernelTimeEnd, UserTimeEnd, Dummy,KernelTimeStart,UserTimeStart: FILETIME;
   stKernelTimeEnd, stUserTimeEnd, stKernelTimeStart, stUserTimeStart: TSystemTime;
   KernelTimeElapsed,UserTimeElapsed,TotalTimeElapsed: Longint;
   ColapsTime,UserTime,KernelTime: TDateTime;
begin
 New(T);
 memo1.Clear;
 T:=TimeList.Items[0];

 GetProcessTimes(GetCurrentProcess,Dummy,Dummy,KernelTimeEnd,UserTimeEnd);

 KernelTime := FileTimeToDateTime(T.KernelTimeStart)-FileTimeToDateTime(KernelTimeEnd); //время ядра
 UserTime   := FileTimeToDateTime(T.UserTimeStart)-FileTimeToDateTime(UserTimeEnd);     //время юзера
 ColapsTime := KernelTime+UserTime;                                                     //общее время ядро+юзер
 
 memo1.Lines.Add("ColapsTime = "+TimeToStr(ColapsTime));  //вывод времени 0:00:0 Ч:M:C


 
icWasya ©   (2007-06-05 10:24) [5]

FormatDateTime("HH:NN:SS.ZZZ",ColapsTime)


 
Koha ©   (2007-06-05 10:30) [6]


> MBo ©   (05.06.07 09:30) [3]
> p.s. функция дает относительное время в миллисекундах


- допустим есть еще некоторые способы высчитать в миллисекондцах, а как их представить в форматировнном виде в доступном понимании?  

Int64(UserT) div 10000; - почему надо делить на 10000?


 
Koha ©   (2007-06-05 10:46) [7]


> icWasya ©   (05.06.07 10:24) [5]
> FormatDateTime("HH:NN:SS.ZZZ",ColapsTime)


теперь все работает гламурно.

- а как из чистых неформатированных миллисекондцах получить форматированное представление?


 
ЮЮ ©   (2007-06-05 11:19) [8]

> - а как из чистых неформатированных миллисекондцах получить
> форматированное представление?

разделить на количество милисикулд в сутках и получишь TDateTime, а с ним ты уже умеешь гламурно обращаться :)


 
MBo ©   (2007-06-05 12:45) [9]

>почему надо делить на 10000?
Потому что эта функция выдает время в 100-наносекундных интервалах



Страницы: 1 вся ветка

Текущий архив: 2007.07.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
15-1180866473
daemon_007
2007-06-03 14:27
2007.07.01
Please, помогите решить задачки по делфи очень срочно!!!!


2-1181124612
Wolferio
2007-06-06 14:10
2007.07.01
Excell количество Листов


2-1181299998
ЮРЕЦ
2007-06-08 14:53
2007.07.01
из bmp, jpg в G-code


15-1180607764
ZeroDivide
2007-05-31 14:36
2007.07.01
Asus - ацтой


2-1180967367
GLXV
2007-06-04 18:29
2007.07.01
DriveList (ListBox) --> на ListView