システムが新しいスレッドを作成すると、これもスレッドその非同期プロシージャコール(APC)キューに関連付けられたキューを作成します。
いくつかの非同期操作は、例えば、APCを添加することによって達成することができ、私は今、IO要求/完了を学びます。
BOOL ReadFileEx(
のhFileハンドル
LPVOID lpBuffer、
DWORD nNumberOfBytesToRead、
LPOVERLAPPED lpOverlapped、
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutineを
)
IO完了は、APCシステムキューは、スレッドに加え、そしてlpCompleteionRoutine lpOverlappedを含むされます。スレッドは、非実行状態の状態にあるときに警告であり、システムは、APC内のエントリを削除し、前記コールバック関数ように実行のスレッドであろう。このアクションは、キューが空になるまで、私は、スレッドは、通常の航跡を中断することができると思い繰り返されます。
非実行状態スレッドの呼び出しは次のように、スリープ機能を待っています
DWORD SleepEx(DWORD dwMilliseconds、BOOL bAlertable)。DWORD WaitForSigleObjectEx(hObjectは、DWORD dwMillisecondsハンドルBOOL bAlertableを)
真= bAlertable;警告状態です!
APCは、コードの別の部分を呼び出し、それがwaitableTimerの一例です。
#include <iostreamの> する#include <process.h> の#include <はWindows.h> の#include <TCHAR.H> する#include < 文字列・H> ボイドAPIENTRYのTimerAPCRoutine(PVOID pvArgToCompleteRoutine、DWORD dwTimerLowValue、DWORD dwTimerHighValue)。 ボイドSomeFunc() { HANDLE hTimer = CreateWaitableTimer(NULL、TRUE、NULL); LARGE_INTEGER李 = { 0 }。 SetWaitableTimer(hTimer、 &李、5000、TimerAPCRoutine、NULL、偽); SleepEx(INFINITE、真); CloseHandleを(hTimer)。 } _tcscat_s(szBuf、_countof(szBuf)ボイドAPIENTRY TimerAPCRoutine(PVOID pvArgToCompleteRoutine、DWORD dwTimerLowValue、DWORD dwTimerHighValue) { FILETIME ftUTC、ftLocal。 SYSTEMTIME ST; TCHAR szBuf [ 256 ]。 ftUTC.dwHighDateTime = dwTimerHighValue。 ftUTC.dwLowDateTime = dwTimerLowValue。 FileTimeToLocalFileTime(&ftUTC、&ftLocal)。 FileTimeToSystemTime(&ftLocal、&ST); getDateFormat(LOCALE_USER_DEFAULT、DATE_LONGDATE、 &ST、NULL、szBuf、_countof(szBuf))。" " ); GetTimeFormat(LOCALE_USER_DEFAULT、 0、&ST、NULL、_tcschr(szBuf、TEXT(' \ 0 '))、(int型)(_ countof(szBuf) - _tcslen(szBuf))); メッセージボックス(NULL、szBuf、TEXT(" タイマで消えた... " )、MB_OK); } INT wmain(INT ARGC、wchar_t型* ARGV []) { SomeFunc()。 char型のC; std :: cinを >> C。 リターン 0 ; }
スレッドは、APCのコールバック関数を実行したとき、
要約:
APCは、スレッドに関連付けられたキュー管理システムでは、非同期操作を実行するために使用することができます。
APCのコールバック関数は、スリープ状態に元のスレッドに元のスレッドで呼び出されます。