AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.05.2011, 15:28   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Измерение времени точнее чем Winapi::getTickcount()
Добрый день всем.

Появилась задача померять время точнее чем Winapi::getTickcount()
Попробовал применить функции win32Api
QueryPerformanceCounter
QueryPerformanceFrequency

Получился такой код (в 3-ке успешно работал)

X++:
// pkoz 08.01.2011
static int64 GRD_getQueryPerformanceCounter()
{
    #define.offset0(0)
//    #define.offset2(2)
    #define.offset4(4)
    #define.KernelDLL('KERNEL32')

    DLLFunction                     _getCounter ;
    DLL             _dll            = new DLL(#kernelDLL);
    int64           Counter;
    Binary          struct          = new Binary(8);
    _getCounter                  = new DLLFunction(_dll, 'QueryPerformanceCounter');
    _getCounter.returns(ExtTypes::Byte);
    _getCounter.arg(ExtTypes::Pointer);
    struct.dWord(#offset0,0);
    struct.dWord(#offset4,0);

    if (_getCounter.call(struct))
    {
        Counter =struct.qWord(#offset0);
    }
    return Counter;
}
X++:
static real GRD_getQueryPerformanceCounterDelta(
        int64   _iStart,
        int64   _koeff = 1000 // миллисекунды, если результат нужен в секундах, то передать 1
        )
{
    real        ret;
    int64       iEnd;
    int64       iDelta;
    int64       iFreq;
    ;
    iEnd   = Global::GRD_getQueryPerformanceCounter();
    iDelta = iEnd - _iStart;

    iFreq  = Global::GRD_getQueryPerformanceFrequency();
    ret = (iFreq == 0) ? 0 : iDelta / iFreq * _koeff;
    return ret;


}
X++:
// pkoz 08.01.2011
static int64 GRD_getQueryPerformanceFrequency()
{
    #define.offset0(0)
//    #define.offset2(2)
    #define.offset4(4)
    #define.KernelDLL('KERNEL32')

    DLLFunction                     _getFrequency ;
    DLL             _dll            = new DLL(#kernelDLL);
    //int            frequency;
    int64           frequency;
    Binary          struct          = new Binary(8);
    _getFrequency                  = new DLLFunction(_dll, 'QueryPerformanceFrequency');
    _getFrequency.returns(ExtTypes::Byte);
    _getFrequency.arg(ExtTypes::Pointer);
    struct.dWord(#offset0,0);
    struct.dWord(#offset4,0);

    if (_getFrequency.call(struct))
    {
        //frequency =struct.dWord(#offset0);
        //if (frequency<10000000)
        //    frequency= 0;
        //else
        //    frequency = real2int(round(frequency/1000000.0,1));

        //return frequency;
        frequency =struct.qWord(#offset0);
    }
    return frequency;
}
Но в 64-битном окружении он естественно не работает.
У кого-нить есть аналог работы со счетчиками работающий и в 64-м окружении ?
Полагаю, надо просто переложить эти функции на .Net вызовы. Сам переложить затруднился.
Старый 16.05.2011, 17:20   #2  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
А какую ошибку выдает?

Цитата:
If the function fails, the return value is zero. To get extended error information, call GetLastError. For example, if the installed hardware does not support a high-resolution performance counter, the function fails.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 16.05.2011, 18:34   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
А какую ошибку выдает?



http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Цитата:
Функция "QueryPerformanceCounter" в библиотеке DLL "KERNEL32" привела к возникновению исключения.
Этот код в принципе не должен работать на 64-битном аосе при выполнении на сервере.
Старый 16.05.2011, 19:46   #4  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Почему?

То что приписка 32 на конце, на сколько я понимаю, не означает что это 32 bit DLL.
32 bit dll нильзя загрузить на 64 битной винде.

Попробуйте такой макрос в Екселе запустить:
Если чтото выплюнит на лист - значит все работает.

ЗЫ У меня на 64битной ОС это работает. Подозреваю, что на надо было offset переменные трогать.

Цитата:
Option Explicit

Declare Function QueryPerformanceCounter Lib "Kernel32" _
(X As Currency) As Boolean
Declare Function QueryPerformanceFrequency Lib "Kernel32" _
(X As Currency) As Boolean

Sub Test_Timers()
Dim Ctr1 As Currency, Ctr2 As Currency, Freq As Currency
Dim Count1 As Long, Count2 As Long, Loops As Long
'
' Time QueryPerformanceCounter
'
If QueryPerformanceCounter(Ctr1) Then
QueryPerformanceCounter Ctr2
Range("B10").FormulaR1C1 = Ctr1
Range("B11").FormulaR1C1 = Ctr2


QueryPerformanceFrequency Freq
Range("B12").FormulaR1C1 = (Ctr2 - Ctr1) / Freq
Else
Range("B10").FormulaR1C1 = "High-resolution counter not supported."
End If

End Sub
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0

Последний раз редактировалось Alex_KD; 16.05.2011 в 19:48.
Старый 16.05.2011, 21:35   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Если я все правильно понимаю, то проблема не в том, что как-то некорректно происходит вызов dll-ки, а в том что 64-битный аос не поддерживает вызовы 32-битных dll
т.е. приведенный вами код нельзя портировать на X++, так чтобы он заработал на аосе под 64-битной операционкой. (Приведенный мной код тоже успешно работает но на 32 битных операционках)
Теги
64-bit, производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Хочу зеленый калькулятор, используя WinApi Pustik DAX: Программирование 5 03.02.2011 14:33
Dynamics AX Geek: Finding files with WinAPI Blog bot DAX Blogs 1 08.10.2009 17:36
Dynamics AX Geek: Finding files with WinAPI Blog bot DAX Blogs 0 28.10.2006 16:40
Учет рабочего времени Orion DAX: Функционал 1 18.07.2005 16:52
WinApi. Удаление файлов глючит. NJD DAX: Программирование 10 05.12.2003 13:31

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:08.