APC(非同期プロシージャコール)

システムが新しいスレッドを作成すると、これもスレッドその非同期プロシージャコール(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のコールバック関数は、スリープ状態に元のスレッドに元のスレッドで呼び出されます。

 

おすすめ

転載: www.cnblogs.com/wyh1993/p/11666673.html