16.05.2011, 15:28 | #1 |
Участник
|
Измерение времени точнее чем 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-м окружении ? Полагаю, надо просто переложить эти функции на .Net вызовы. Сам переложить затруднился. |
|
16.05.2011, 17:20 | #2 |
Участник
|
А какую ошибку выдает?
Цитата:
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.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
16.05.2011, 18:34 | #3 |
Участник
|
|
|
16.05.2011, 19:46 | #4 |
Участник
|
Почему?
То что приписка 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 |
Участник
|
Если я все правильно понимаю, то проблема не в том, что как-то некорректно происходит вызов dll-ки, а в том что 64-битный аос не поддерживает вызовы 32-битных dll
т.е. приведенный вами код нельзя портировать на X++, так чтобы он заработал на аосе под 64-битной операционкой. (Приведенный мной код тоже успешно работает но на 32 битных операционках) |
|