Здравствуйте, прогеры! Нужна ваша помощь. Проблема такая - сижу в делфи (закрываясь шитом от кучи полетевших помидоров) и хочу один компонент перевести в CLX, то бишь ввести кроссплатформенность. Проблем много, но потихоньку разбираюсь... Вот щас встала задачка: нужен аналог виндовой функции GetTickCount, причем рабочий. Слышал что-то про clock()/CLOCK_PER_SECOND, но не знаю, в каком модуле/заголовке искать. Поможите чем можете...
Инструкция rdtsc возвращает количество тактов, прошедших с момента включения компа, видимо нужно поделить их на тактовую частоту процессора и преобразовать в миллисекунды
В принципе сейчас сложно найти комп менее пня. Поэтому сие можно назвать кроссплатформенным. Всегда можно проверять через CPUID. Ещё в апи есть QueryPerformanceCounter и иже с ним. Там даже частоту проца считать не надо. И пнём ограничиваться. Работает с винды95. Высокая точность тайминга.
Вообще надо посмотреть для чего нужен таймер. Может можно обойтись просто SetTimer/KillTimer? Это обычно не так сильно грузит систему.
2 SolidCode: это Win32API, AFAIK. А мине нуно, чтоб работало в линуксе... Вот я и спрашиваю, есть ли линуксовый аналог GetTickCount... 2 bogrus: Возможно, это тоже решение, но Делфи, знаете ли не знает этой инструкции, а мучиться с опкодами я бы не хотел... 2 semen: thanks, будем искать
Это в Си должно быть. В системных includ-ах смотри. Прикрутить к Kylix ( если я правильно перевел CLX) должно быть просто. Сама функция clock() должна быть в стандартной Си-шной библиотеке - она везде используется.
2 valterg: CLX есть и в Делфи. Я на Делфи сижу. Подскажите мне, где это есть, а то я сишные модули пока не достал... Мне точно надо знать, есть это или нет. У меня там директивы условной компиляции идут: {$IFDEF LINUX} здесь подключаем одни модули для линуха {$ELSE} здесь для выни {$ENDIF} модуль скажите, название хотя бы... Кто в kylix сидел хоть раз, скажите Пока тестирую на винде, но потом на линухе буду проверять. Дистрибутив надо достать, а пока проверяю только на теории...
Вот тут в модуле System нашел реализацию процедуры Randomize: procedure Randomize; {$IFDEF LINUX} begin RandSeed := _time(nil); end; {$ENDIF} {$IFDEF MSWINDOWS} var Counter: Int64; begin if QueryPerformanceCounter(Counter) then RandSeed := Counter else RandSeed := GetTickCount; end; {$ENDIF} Кто-нибудь может мне сказать, что дает обращение _time(nil)?
Кому интересно, мне на форуме realcoding.net ответили: Код (Text): uses Libc, ..... {$IFDEF LINUX} function GetTickCount: Cardinal; var tv: timeval; begin gettimeofday(tv, nil); {$RANGECHECKS OFF} Result := int64(tv.tv_sec) * 1000 + tv.tv_usec div 1000; end; {$ENDIF}