CreateThread()関数


HANDLE CreateThread(
 LPSECURITY_ATTRIBUTES lpsa,
 DWORD dwStackSize,
 LPTHREAD_START_ROUTINE pfnThreadProc,
 void* pvParam,
 DWORD dwCreationFlags,
 DWORD* pdwThreadId
);

新規作成したスレッドへのハンドルを返します。
失敗した場合は NULL を返します。
スレッドは、呼び出し側プロセスのアドレス空間で実行されます。

lpsa新しいスレッドのセキュリティ属性。
取得したハンドルの子プロセスへの継承を許可するかどうかを決める、SECURITY_ATTRIBUTES構造体へのポインタを指定します。
NULLを指定すると、ハンドルは継承されません。
※特別な意図が無い限りNULLでいいでしょう。
dwStackSize新しいスレッドのスタックサイズ。
新しいスレッドが持つスタックのサイズを、バイト単位で指定します。
利用可能なメモリのサイズよりも大きなサイズを指定すると、CreateThread関数は失敗します。
0を指定すると、デフォルトのサイズになります。
※Windowsは必要に応じてスタックサイズを拡張するため、デフォルトサイズを表す0を指定します。
pfnThreadProc新しいスレッドのスレッドプロシージャ。
新しいスレッドの開始アドレスを指定します。
通常、WINAPI呼び出し規約で定義された関数のアドレスを指定します。
この関数の書式を次に示します。
DWORD WINAPI ThreadFunc( LPVOID );
pvParamスレッドプロシージャに渡されるパラメータ。
通常はポインタとして使います。
この引数を利用して何らかのデータを渡せば、スレッドごとに異なる処理をさせることができます。
受け渡すデータが多い場合は構造体にデータを格納し、そのポインタを渡します。
dwCreationFlags作成フラグ(0またはCREATE_SUSPENDED)。
CREATE_SUSPENDEDを指定するとスレッドを中断された状態で作成され、ResumeThread関数を呼び出すまでは動作しません。
※通常は0を指定して、作成と同時にスレッドを起動します。
pdwThreadId正常終了したときに、新しく作成されたスレッドのスレッドIDを受け取るDWORD型変数へのアドレス。


CreateThread( NULL, 0, ThreadFunc, ( LPVOID )&param, 0, &dwThreadID );


・呼び出し側は、作成に成功したスレッドの関数の終了を待ちません。
・作成されたスレッドは、関数の終了をもって破棄されます。
・マルチスレッドは、複数のコードがばらばらのタイミングで動作するため、
複数のスレッドが同じグローバル変数を参照する場合などは、
プログラムの方法によってはデータの整合性が失われるなどの
問題が発生する事もあります。
・C言語のライブラリを利用する場合はCreateThread関数ではなく_beginthread()関数を使うようにします。
Windows > スレッド | comments (0) | trackbacks (0)

PeekMessage()関数


BOOL PeekMessage(
 LPMSG lpMsg,
 HWND hWnd,
 UINT wMsgFilterMin,
 UINT wMsgFilterMax,
 UINT wRemoveMsg
);


lpMsgメッセージを取得するMSG構造体へのポインタ
hWndメッセージを取得するウィンドウへのハンドル
wMsgFilterMin取得するメッセージの最小値。両方0にするとフィルタリングしない。
wMsgFilterMax取得するメッセージの最大値。両方0にするとフィルタリングしない。
wRemoveMsgPM_REMOVE メッセージをキューから削除する
PM_NOREMOVE メッセージをキューから削除しない。

メッセージを取得した時は、0以外の値が返ります。
メッセージを取得しなかった時は、0が返ります。

GetMessage関数と違い、PeekMessage関数は、キュー内にメッセージが置かれるまで待つことはありません。


while (1) {
 if ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) {
  // メッセージがある場合はそれを処理する
  if ( msg.message == WM_QUIT ) break;
  DispatchMessage( &msg );
 } else {
  // アイドル時の処理を行う
 }
}

Windows > メッセージループ | comments (0) | trackbacks (0)