Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
2-1181413107
Infinityx93
2007-06-09 22:18
2007.07.01
проценты в chart


2-1181218595
webpauk
2007-06-07 16:16
2007.07.01
Array Pointer


2-1181138575
frameZ
2007-06-06 18:02
2007.07.01
запуск приложений


2-1181129557
TIF
2007-06-06 15:32
2007.07.01
Картинки в Браузере


11-1164289862
Psychedelic
2006-11-23 16:51
2007.07.01
Unit mirror was compiled with a different version of KOL.TOnChar





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский