・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_;
}
・エントリポイント
・スレッドを交互に実行する関数
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);
}