Скачать MetaTrader 5

Высокочастотные таймеры в разных языках

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Klenov
1884
Alexey Klenov  

Добрый день

Как столкнулся со странной проблемой

Написал на с++ простенькую программу для получения "текущего" времени от последней перезагрузки компьютера.

Потом зацепился за этот же таймер из C# синхронизацию делал по средствам SetEvent в с++.

В итоге на с++ данные были позже чем полученные после срабатывания эвента в C#

                                EventWaitHandle ChangeEvent = new EventWaitHandle(false, EventResetMode.ManualReset, "Global\\Event");
                                ChangeEvent.WaitOne();

на 17783 мс. Как такое может быть пока ума не приложу. В интернете пишут про то что это глюк многоядерных процессоров но вроде этот счетчик привязан к материнке, или я ошибаюсь.

Делал распринтовку того что достаю из QueryPerformanceFrequency и QueryPerformanceCounter

Данные совпадают, различие идет только по полю QuadPart после вызова QueryPerformanceCounter

// TEstRealMSC++.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <windows.h> 
#include <atlstr.h>
#include <iostream>

using namespace System;
using namespace std;

double PCFreq;
LARGE_INTEGER  li;


void GetPCFreq()
{

        if(!QueryPerformanceFrequency(&li))
        {return;}


        PCFreq = double(li.QuadPart)/1000.0;
}
unsigned __int64 GetCounter()
{
        QueryPerformanceCounter(&li);
        return unsigned __int64(li.QuadPart)/PCFreq;
}


int main( int argc, char *argv[] )
{
        GetPCFreq();
        Console::WriteLine(li.QuadPart);
        Console::WriteLine(PCFreq);
        HANDLE hEvent_G1=CreateEventA( NULL, TRUE,TRUE, "Global\\Event" );
        Sleep(7000);
        Console::WriteLine(GetCounter());
        Console::WriteLine(li.QuadPart);
        Console::WriteLine(li.HighPart);
        SetEvent (hEvent_G1);
        Sleep(1000000);
        return 0;
}

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий