Stoppt die Vorratsdatenspeicherung! Jetzt klicken && handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
 
Multimedia-Timer
von Plapperkatze am 4.Februar 2006 um 16:21
zurück zur Kategorie "Tutorials"

Die Funktionen QueryPerformanceFrequency() und QueryPerformanceCounter() stellen Zugriff auf einen sehr schnellen Timer zur Verfügung, wenn die Hardware dafür vorhanden ist. Meistens ist sie das, aber wenn nicht (QueryPerformanceFrequency() gibt 0 zurück) müssen wir mit timeGetTime() auf einen langsameren Timer ausweichen.

Wir messen also einmal, wie lange es dauert, jeden Pixel im Fenster mit SetPixel(hdc,x,y,color) einzufärben. Das ganze sieht dann so aus:



Hier ist der Quelltext. Die relevanten Stellen sind hervorgehoben.

#include <windows.h>
#include <stdio.h> // für sprintf

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
const char szAppName[]    = \"High Resolution Performance Counter\";

int width=640;
int height=480;

 char c[256];
 LONGLONG Frequency, CurrentTime, LastTime;
 double TimeElapsed, TimeScale;
 BOOL CounterAvailable=FALSE;


int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
  MSG        msg;
  HWND       hWnd;

  WNDCLASS   wc;
 
  wc.style               = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc         = WndProc;
  wc.cbClsExtra          = 0;
  wc.cbWndExtra          = 0;
  wc.hInstance           = hInstance;
  wc.hCursor             = LoadCursor(NULL, IDC_ARROW);
  wc.hIcon               = LoadIcon(NULL, MAKEINTRESOURCE(\"1\"));
  wc.hbrBackground       = (HBRUSH) GetStockObject(WHITE_BRUSH);
  wc.lpszClassName       = szAppName;
  wc.lpszMenuName        = NULL;

  RegisterClass(&wc);
 
  hWnd = CreateWindow(   szAppName,
                         szAppName,
                         WS_OVERLAPPED|WS_SYSMENU,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         NULL,
                         NULL,
                         hInstance,
                         NULL);

  ShowWindow(hWnd, iCmdShow);
  UpdateWindow(hWnd);
 
  while (GetMessage(&msg, NULL, 0, 0))
  {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
  }
  return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 RECT r;
 PAINTSTRUCT ps;
 HDC hDC;
 int x,y;

 switch (message)
 {
    case WM_PAINT:
    {
      if (QueryPerformanceFrequency((LARGE_INTEGER*)&Frequency))
      {
        CounterAvailable = TRUE;
        TimeScale = 1.0/Frequency;
        QueryPerformanceCounter((LARGE_INTEGER*)&LastTime);
      }
      else
      {
        LastTime = timeGetTime();
        TimeScale = 0.001;
      }

      GetClientRect(hWnd,&r);
      hDC = BeginPaint(hWnd, &ps);
     
      for(y=0;y<r.bottom;y++)
        for(x=0;x<r.right;x++)
      {
        SetPixel(hDC,x,y,RGB(x%256,y%256,256-(x/2)%256));  
      }
      EndPaint(hWnd, &ps);

      if (CounterAvailable)QueryPerformanceCounter((LARGE_INTEGER*) &CurrentTime);
      else CurrentTime = timeGetTime();
      TimeElapsed = (CurrentTime - LastTime) * TimeScale;
      LastTime = CurrentTime;


      sprintf(c,"%lf",TimeElapsed);
      SetWindowText(hWnd,c);

      return 0;
    }
    case WM_DESTROY:
    {
       PostQuitMessage(0);
       return 0;
    }
 }
 return DefWindowProc(hWnd, message, wParam, lParam);
}

LONGLONG ist übrigens ein 64 bit Integer.
TimeElapsed enthält die gemessene Zeit in Sekunden.

gruesse, die plapperkatz

zurück zur Kategorie "Tutorials"
[0 Kommentare]

Name


Kommentar




Bitte abtippen


 
(C) 2006-20012 Plapperkatze - 220706 Besucher seit dem 23.01.2012 Login