"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني تحقيق توقيت دقيق بالنانو ثانية على نظام التشغيل Windows دون دعم Clock_gettime الأصلي؟

كيف يمكنني تحقيق توقيت دقيق بالنانو ثانية على نظام التشغيل Windows دون دعم Clock_gettime الأصلي؟

تم النشر بتاريخ 2024-11-07
تصفح:496

How can I achieve nanosecond precision timing on Windows without native clock_gettime support?

نقل Clock_gettime إلى Windows

وظيفة Clock_gettime هي وظيفة POSIX القياسية التي توفر طريقة للحصول على الوقت الحالي بدقة النانو ثانية. ومع ذلك، فهو غير مدعوم أصلاً على نظام التشغيل Windows.

نقل التعليمات البرمجية إلى Windows

لنقل التعليمات البرمجية التي تستخدم Clock_gettime إلى Windows، يمكنك تنفيذ وظيفة بديلة باستخدام Win32 واجهة برمجة التطبيقات. فيما يلي مثال لكيفية القيام بذلك:

#include <Windows.h>

// Returns the file time offset for Windows.
LARGE_INTEGER getFILETIMEoffset() {
    SYSTEMTIME s;
    FILETIME f;
    LARGE_INTEGER t;

    s.wYear = 1970;
    s.wMonth = 1;
    s.wDay = 1;
    s.wHour = 0;
    s.wMinute = 0;
    s.wSecond = 0;
    s.wMilliseconds = 0;
    SystemTimeToFileTime(&s, &f);
    t.QuadPart = f.dwHighDateTime;
    t.QuadPart <<= 32;
    t.QuadPart |= f.dwLowDateTime;
    return (t);
}

// Replacement for clock_gettime function.
int clock_gettime(int X, struct timeval *tv) {
    LARGE_INTEGER t;
    FILETIME f;
    double microseconds;
    static LARGE_INTEGER offset;
    static double frequencyToMicroseconds;
    static int initialized = 0;
    static BOOL usePerformanceCounter = 0;

    if (!initialized) {
        LARGE_INTEGER performanceFrequency;
        initialized = 1;
        usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency);
        if (usePerformanceCounter) {
            QueryPerformanceCounter(&offset);
            frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
        } else {
            offset = getFILETIMEoffset();
            frequencyToMicroseconds = 10.;
        }
    }
    if (usePerformanceCounter) QueryPerformanceCounter(&t);
    else {
        GetSystemTimeAsFileTime(&f);
        t.QuadPart = f.dwHighDateTime;
        t.QuadPart <<= 32;
        t.QuadPart |= f.dwLowDateTime;
    }

    t.QuadPart -= offset.QuadPart;
    microseconds = (double)t.QuadPart / frequencyToMicroseconds;
    t.QuadPart = microseconds;
    tv->tv_sec = t.QuadPart / 1000000;
    tv->tv_usec = t.QuadPart % 1000000;
    return (0);
}

بمجرد تنفيذ وظيفة الاستبدال، يمكنك استخدامها في التعليمات البرمجية الخاصة بك للحصول على الوقت الحالي بدقة النانو ثانية. لاحظ أنك قد تحتاج إلى إجراء تعديلات إضافية على التعليمات البرمجية الخاصة بك لمراعاة أي اختلافات في سلوك Clock_gettime على منصات مختلفة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3