2 -ой миллисекундный таймер. - страница 2

 
Mikalas:

Измерение временных интервалов с большей точностью, чем  GetTickCount().

#import "kernel32.dll"
bool QueryPerformanceCounter(ulong &ticks);
bool QueryPerformanceFrequency(ulong &freq);
#import
//---
void OnStart()
{
   ulong t1, t2, st;
   QueryPerformanceFrequency(st);
   if(st>1000)
   {
      st=(ulong)1e9/st;
      QueryPerformanceCounter(t1);
      Sleep(20);
      QueryPerformanceCounter(t2);
      Print("Tик таймера=",st," нс. // Sleep(20) = ",(t2-t1)*st," нс.");
   }else Print("Таймер высокого разрешения не поддерживается");
}

 

2013.07.12 18:40:43     test_timer (Si-9.13,M15)        Tик таймера=410 нс. // Sleep(20) = 20511480 нс.


 
Yurich:


нс ? нано-секунды? быть такого не может )))

Кстати а с какой дискретностью должны вызываться 2 таймера?

Возможно сделать 2 счетчика пересчитываемые по OnTimer() скажем 100мс, там же делать проверку и вызывать одну и/или вторую функцию обработки...

 
если юзать dll, то тогда уж GetTickCount64() проще
 
Он установливается в ноль и не тикает ( для integer)
 
sergeev:
если юзать dll, то тогда уж GetTickCount64() проще
Да и НС точность не нужна.
 
Mikalas:
Он установливается в ноль и не тикает ( для integer)

Откуда такие сведения?

В справке так написано:

Примечание

Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней при непрерывной работе компьютера. 

Это тонко намекает, что он не останавливается.
 
Integer:

Откуда такие сведения?

В справке так написано:

Это тонко намекает, что он не останавливается.

Прочитайте в MSDN

Там без тонкостей. 

The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days. To avoid this problem, use the GetTickCount64 function. Otherwise, check for an overflow condition when comparing times. 

GetTickCount64 function (Windows)
  • msdn.microsoft.com
Retrieves the number of milliseconds that have elapsed since the system was started. Syntax Parameters This function has no parameters. Return value The number of milliseconds. Remarks The resolution of the GetTickCount64 function is limited to the resolution of the system timer, which is typically in the range of 10 milliseconds to 16...
 
Mikalas:

Прочитайте в MSDN

Там без тонкостей. 

The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days. To avoid this problem, use the GetTickCount64 function. Otherwise, check for an overflow condition when comparing times. 

Прочитал. Не обнаружил того, что вы выдумали про остановку на нуле. Вернется в ноль и пойдет на второй круг. И не в ноль, а около нуля. Т.е. просто пойдет на второй круг.
 

C++

ULONGLONG WINAPI GetTickCount64(void);

 ULONGLONG в MQL что может быть сопоставимо?

И как Yorich делает тоже нельзя:

BOOL WINAPI QueryPerformanceCounter(
  _Out_  LARGE_INTEGER *lpPerformanceCount
);

 

LARGE_INTEGER - union

typedef union _LARGE_INTEGER {
  struct {
    DWORD LowPart;
    LONG  HighPart;
  };
  struct {
    DWORD LowPart;
    LONG  HighPart;
  } u;
  LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;
 
Mikalas:

C++

 ULONGLONG в MQL что может быть сопоставимо?

long/ulong


И как Yorich делает тоже нельзя:

LARGE_INTEGER - union

можно. union / struct это просто показатель объема памяти.

не более. тем более что передается указатель.