По умолчанию в TThread классовая функция GetTickCount имеет тип Cardinal, соответственно если приложение рассчитано на долговременную работу, то через 40 дней результат этой функции или уложит приложение (если отключена защита от переполнения) или превратит приложение в тыкву (если на этом завязана какая то логика).
Для своего проекта написал хелпер для класса TThread, вдруг кому пригодится. Тестил на win10 x64 и linux x64.
unit UnitTThreadHelper;
interface
uses
{$IFDEF MSWINDOWS}
Winapi.Windows,
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
Posix.SysTypes,
{$IFDEF MACOS}
Macapi.CoreServices,
{$ENDIF MACOS}
{$IFDEF ANDROID}
Posix.Fcntl,
{$ENDIF ANDROID}
{$IFDEF LINUX}
Posix.Time,
{$ENDIF LINUX}
{$ENDIF POSIX}
System.Classes;
type
TThreadHelper = class helper for TThread
class function GetTickCount64 : Int64; static;
end;
implementation
class function TThreadHelper.GetTickCount64 : Int64;
{$IF Defined(MSWINDOWS)}
begin
Result := Winapi.Windows.GetTickCount64;
end;
{$ELSEIF Defined(MACOS)}
begin
Result := AbsoluteToNanoseconds(mach_absolute_time) div 1000000;
end;
{$ELSEIF Defined(POSIX)}
var
res: timespec;
begin
clock_gettime(CLOCK_MONOTONIC, @res);
Result := (Int64(1000000000) * res.tv_sec + res.tv_nsec) div 1000000;
end;
{$ELSE OTHERPLATFORM}
{$MESSAGE Fatal 'Method not implemented for Platform'}
{$ENDIF OTHERPLATFORM}
end.
При попытке запуска на win x32 упадет - не используйте или проверяйте битность:
if CheckWin32Version(6, 0) then
begin
GetTickCount64;
end else
begin
GetTickCount;
end;
Вопрос
Евгений Корепов
По умолчанию в TThread классовая функция GetTickCount имеет тип Cardinal, соответственно если приложение рассчитано на долговременную работу, то через 40 дней результат этой функции или уложит приложение (если отключена защита от переполнения) или превратит приложение в тыкву (если на этом завязана какая то логика).
Для своего проекта написал хелпер для класса TThread, вдруг кому пригодится. Тестил на win10 x64 и linux x64.
unit UnitTThreadHelper; interface uses {$IFDEF MSWINDOWS} Winapi.Windows, {$ENDIF MSWINDOWS} {$IFDEF POSIX} Posix.SysTypes, {$IFDEF MACOS} Macapi.CoreServices, {$ENDIF MACOS} {$IFDEF ANDROID} Posix.Fcntl, {$ENDIF ANDROID} {$IFDEF LINUX} Posix.Time, {$ENDIF LINUX} {$ENDIF POSIX} System.Classes; type TThreadHelper = class helper for TThread class function GetTickCount64 : Int64; static; end; implementation class function TThreadHelper.GetTickCount64 : Int64; {$IF Defined(MSWINDOWS)} begin Result := Winapi.Windows.GetTickCount64; end; {$ELSEIF Defined(MACOS)} begin Result := AbsoluteToNanoseconds(mach_absolute_time) div 1000000; end; {$ELSEIF Defined(POSIX)} var res: timespec; begin clock_gettime(CLOCK_MONOTONIC, @res); Result := (Int64(1000000000) * res.tv_sec + res.tv_nsec) div 1000000; end; {$ELSE OTHERPLATFORM} {$MESSAGE Fatal 'Method not implemented for Platform'} {$ENDIF OTHERPLATFORM} end.
При попытке запуска на win x32 упадет - не используйте или проверяйте битность:
if CheckWin32Version(6, 0) then begin GetTickCount64; end else begin GetTickCount; end;
Ссылка на комментарий
0 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.