Как перенести код вызова QueryPerformanceFrequency на Rust? - PullRequest
0 голосов
/ 25 марта 2020

Мне нужно перенести этот C код в Rust:

QueryPerformanceFrequency((unsigned long long int *) &frequency);

Я не нашел функцию, которая делает это.

Вариант Linux выглядит следующим образом:

struct timespec now;
if (clock_gettime(CLOCK_MONOTONIC, &now) == 0)
    frequency = 1000000000;

Должен ли я позвонить std::time::Instant::now() и установить частоту 1000000000?

Это полная функция:

// Initializes hi-resolution MONOTONIC timer
static void InitTimer(void)
{
    srand(time(NULL));              // Initialize random seed

    #if defined(_WIN32)
        QueryPerformanceFrequency((unsigned long long int *) &frequency);
    #endif

    #if defined(__linux__)
        struct timespec now;
        if (clock_gettime(CLOCK_MONOTONIC, &now) == 0)
            frequency = 1000000000;
    #endif

    #if defined(__APPLE__)
        mach_timebase_info_data_t timebase;
        mach_timebase_info(&timebase);
        frequency = (timebase.denom*1e9)/timebase.numer;
    #endif

    baseTime = GetTimeCount();      // Get MONOTONIC clock time offset
    startTime = GetCurrentTime();   // Get current time
}

1 Ответ

3 голосов
/ 25 марта 2020

Прямым решением для доступа к API Windows является использование ящика winapi. В этом случае позвоните QueryPerformanceFrequency:

use std::mem;
use winapi::um::profileapi::QueryPerformanceFrequency;

fn freq() -> u64 {
    unsafe {
        let mut freq = mem::zeroed();
        QueryPerformanceFrequency(&mut freq);
        *freq.QuadPart() as u64
    }
}

fn main() {
    println!("Hello, world!");
}
[dependencies]
winapi = { version = "0.3.8", features = ["profileapi"] }

с высоким разрешением MONOTONI C таймер

Я бы использовал Instant в качестве монотонного c таймера и предположил, что он достаточно высок, пока не доказано обратное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...