Главная страница
    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.47 MB
Время: 0.005 c
1-1177924142
denissoft
2007-04-30 13:09
2007.07.01
что делать если отображение картинок выключено в IE


2-1181137864
Bora_ru
2007-06-06 17:51
2007.07.01
Имя следующего файла


2-1181505983
Bullfrog
2007-06-11 00:06
2007.07.01
Not enough actual parametres


2-1181295308
nstur
2007-06-08 13:35
2007.07.01
Как в DBGrid на поле поставить кнопку вызывающее диалоговое окно


1-1178187804
Liza
2007-05-03 14:23
2007.07.01
Я делаю дипломную и мне нужно сделать прозрачное поле для ввода





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский