memo‎ > ‎

Win32API

・AdgustWindowRect、AdjustWindowRectEx
 クライアント領域サイズを指定した RECT 構造体ポインタを渡し、ウィンドウサイズを設定する。
 スタイル、メニューも指定でき、Ex では拡張スタイルも指定できる
・GetAsyncKeyState(int vKey)
 仮想キーコードを引数とし、そのキーが押されているか調べる
・PDH(Performance Data Helper) - パフォーマンスデータへアクセスできる関数群
QueryPerformanceCounter、QueryPerformanceFrequency
 BOOL QueryPerformanceFrequency( LARGE_INTEGER *lpFrequency )
  1秒あたりのカウント数を取得する
 BOOL QueryPerformanceCounter( LARGE_INTEGER *lpPerformanceCount )
  現在のカウンタを取得する
 LARGE_INTEGER 構造体は QuadPart メンバを使う
以下は .NET の Stopwatch クラスを真似したサンプルです。
 ヘッダファイル(Util.h):
class Stopwatch {
 private:
  unsigned long long frequency_;
  unsigned long long elapsed_;
  unsigned long long start_;
  bool is_running_;
 public:
  Stopwatch();

  void Start();
  void Stop();
  void Reset();
  unsigned long long GetElapsedMilliseconds();
  unsigned long long GetElapsedSeconds();
  unsigned long long GetElapsedTicks();
  unsigned long long GetFrequency();
};

 ソースファイル(Util.cc):
#include "Util.h"

#include <assert.h>

#include <Windows.h>

Stopwatch::Stopwatch() {
  LARGE_INTEGER i;
  if(::QueryPerformanceFrequency(&i) == 0) {
    assert(false);
  }
  frequency_ = i.QuadPart;

  Reset();
}

void Stopwatch::Start() {
  LARGE_INTEGER i;
  ::QueryPerformanceCounter(&i);
  start_ = i.QuadPart;
  is_running_ = true;
}

void Stopwatch::Stop() {
  if(is_running_) {
    LARGE_INTEGER i;
    ::QueryPerformanceCounter(&i);
    elapsed_ += i.QuadPart - start_;
    is_running_ = false;
  }
}

void Stopwatch::Reset() {
  elapsed_ = start_ = 0;
  is_running_ = false;
}

unsigned long long Stopwatch::GetElapsedMilliseconds() {
  return GetElapsedTicks() * 1000 / frequency_;
}

unsigned long long Stopwatch::GetElapsedSeconds() {
  return GetElapsedTicks() / frequency_;
}

unsigned long long Stopwatch::GetElapsedTicks() {
  if (is_running_) {
    LARGE_INTEGER i;
    ::QueryPerformanceCounter(&i);
    return elapsed_ + i.QuadPart - start_;
  } else {
    return elapsed_;
  }
}

unsigned long long Stopwatch::GetFrequency() 
{
  return frequency_;
}
・エントリポイント
 呼び出し規約マクロ  解説
 __stdcall WINAPI, CALLBACK, PASCAL など WinMainやWndProcなどのOSから呼ばれる関数
 __cdecl なし C/C++の関数
・スレッドを交互に実行する関数
AlternateThread.h
#pragma once

void InitializeAlternate();
void Alternate();
void EndAlternate();
AlternateThread.cpp
#include "AlternateThread.h"
#include <Windows.h>

namespace {
HANDLE s_event; // イベントオブジェクト
CRITICAL_SECTION s_section1;
CRITICAL_SECTION s_section2;
}

void InitializeAlternate() {
  InitializeCriticalSection(&s_section1);
  InitializeCriticalSection(&s_section2);
  s_event = CreateEvent(NULL, TRUE, TRUE, NULL); // どっちでもいいが、シグナル状態で初期化
}
void Alternate() {
  EnterCriticalSection(&s_section1);
  SetEvent(s_event); // シグナル状態にする
  EnterCriticalSection(&s_section2);
  ResetEvent(s_event); // 非シグナル状態にする
  LeaveCriticalSection(&s_section1);
  WaitForSingleObject(s_event, INFINITE); // シグナル状態になるまで待機
  LeaveCriticalSection(&s_section2);
}
void EndAlternate() {
  DeleteCriticalSection(&s_section1);
  DeleteCriticalSection(&s_section2);
  CloseHandle(s_event);
}