GetTickCount

Тема в разделе "WASM.UNIX", создана пользователем SegaZero, 12 янв 2005.

  1. SegaZero

    SegaZero New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2005
    Сообщения:
    11
    Адрес:
    амстердам:))
    Здравствуйте, прогеры!

    Нужна ваша помощь. Проблема такая - сижу в делфи (закрываясь шитом от кучи полетевших помидоров) и хочу один компонент перевести в CLX, то бишь ввести кроссплатформенность. Проблем много, но потихоньку разбираюсь...

    Вот щас встала задачка: нужен аналог виндовой функции GetTickCount, причем рабочий. Слышал что-то про clock()/CLOCK_PER_SECOND, но не знаю, в каком модуле/заголовке искать. Поможите чем можете...
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Инструкция rdtsc возвращает количество тактов, прошедших с момента включения компа, видимо нужно поделить их на тактовую частоту процессора и преобразовать в миллисекунды
     
  3. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    bogrus

    rdtsc - не кроссплатформенно.

    SegaZero

    clock() наскока я помню в time.h
     
  4. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan


    В принципе сейчас сложно найти комп менее пня. Поэтому сие можно назвать кроссплатформенным. Всегда можно проверять через CPUID.

    Ещё в апи есть QueryPerformanceCounter и иже с ним. Там даже частоту проца считать не надо. И пнём ограничиваться. Работает с винды95. Высокая точность тайминга.
     
  5. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Вообще надо посмотреть для чего нужен таймер. Может можно обойтись просто SetTimer/KillTimer? Это обычно не так сильно грузит систему.
     
  6. SegaZero

    SegaZero New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2005
    Сообщения:
    11
    Адрес:
    амстердам:))
    2 SolidCode: это Win32API, AFAIK. А мине нуно, чтоб работало в линуксе... Вот я и спрашиваю, есть ли линуксовый аналог GetTickCount...

    2 bogrus: Возможно, это тоже решение, но Делфи, знаете ли не знает этой инструкции, а мучиться с опкодами я бы не хотел...

    2 semen: thanks, будем искать:)
     
  7. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    SolidCode





    Кхм - вообще-то линух не тока на x86 работает.
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105


    Это в Си должно быть. В системных includ-ах

    смотри. Прикрутить к Kylix ( если я правильно

    перевел CLX) должно быть просто. Сама функция

    clock() должна быть в стандартной Си-шной библиотеке -

    она везде используется.
     
  9. SegaZero

    SegaZero New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2005
    Сообщения:
    11
    Адрес:
    амстердам:))
    2 valterg:

    CLX есть и в Делфи. Я на Делфи сижу. Подскажите мне, где это есть, а то я сишные модули пока не достал... Мне точно надо знать, есть это или нет.

    У меня там директивы условной компиляции идут:

    {$IFDEF LINUX}

    здесь подключаем одни модули для линуха

    {$ELSE}

    здесь для выни

    {$ENDIF}

    модуль скажите, название хотя бы...

    Кто в kylix сидел хоть раз, скажите



    Пока тестирую на винде, но потом на линухе буду проверять. Дистрибутив надо достать, а пока проверяю только на теории...
     
  10. SegaZero

    SegaZero New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2005
    Сообщения:
    11
    Адрес:
    амстердам:))
    Вот тут в модуле 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)?
     
  11. SegaZero

    SegaZero New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2005
    Сообщения:
    11
    Адрес:
    амстердам:))
    Кому интересно, мне на форуме realcoding.net ответили:
    Код (Text):
    1. uses Libc, .....
    2. {$IFDEF LINUX}
    3. function GetTickCount: Cardinal;
    4. var
    5. tv: timeval;
    6. begin
    7. gettimeofday(tv, nil);
    8. {$RANGECHECKS OFF}
    9. Result := int64(tv.tv_sec) * 1000 + tv.tv_usec div 1000;
    10. end;
    11. {$ENDIF}