Форум: "Начинающим";
Текущий архив: 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