Windows核心編程:第11章 Windows線程池

來源:互聯網
上載者:User

標籤:定時器   lse   eric   hand   +=   沒有   開始   ongl   winapi   

Github

https://github.com/gongluck/Windows-Core-Program.git

//第11章 Windows線程池.cpp: 定義應用程式的進入點。//#include "stdafx.h"#include "第11章 Windows線程池.h"VOID NTAPI SimpleCB(    _Inout_     PTP_CALLBACK_INSTANCE Instance,    _Inout_opt_ PVOID                 Context){}VOID NTAPI WorkCB(    _Inout_     PTP_CALLBACK_INSTANCE Instance,    _Inout_opt_ PVOID                 Context,    _Inout_     PTP_WORK              Work){}VOID NTAPI TimerCB(    _Inout_     PTP_CALLBACK_INSTANCE Instance,    _Inout_opt_ PVOID                 Context,    _Inout_     PTP_TIMER             Timer){    static DWORD i = 0;    i += 1;    static LARGE_INTEGER li;    li.QuadPart = -10000000ll * i;    static FILETIME duetime = { 0 };    duetime.dwLowDateTime = li.LowPart;    duetime.dwHighDateTime = li.HighPart;    SetThreadpoolTimer(Timer, &duetime, 0, 0); //設定定時器}VOID NTAPI WaitCB(    _Inout_     PTP_CALLBACK_INSTANCE Instance,    _Inout_opt_ PVOID                 Context,    _Inout_     PTP_WAIT              Wait,    _In_        TP_WAIT_RESULT        WaitResult    ){    switch (WaitResult)    {    case WAIT_OBJECT_0:        break;    case WAIT_TIMEOUT:        break;    case WAIT_ABANDONED:        break;    default:        break;    }}VOID WINAPI IoCB(    _Inout_     PTP_CALLBACK_INSTANCE Instance,    _Inout_opt_ PVOID                 Context,    _Inout_opt_ PVOID                 Overlapped,    _In_        ULONG                 IoResult,    _In_        ULONG_PTR             NumberOfBytesTransferred,    _Inout_     PTP_IO                Io){    switch (IoResult)    {    case NO_ERROR:        break;    default:        break;    }}int APIENTRY wWinMain(_In_ HINSTANCE hInstance,    _In_opt_ HINSTANCE hPrevInstance,    _In_ LPWSTR    lpCmdLine,    _In_ int       nCmdShow){    //以非同步方式調用函數    BOOL bres = TrySubmitThreadpoolCallback(SimpleCB, nullptr, nullptr); //將工作項目添加到線程池隊列    PTP_WORK pwork = CreateThreadpoolWork(WorkCB, nullptr, nullptr); //建立一個工作項目    SubmitThreadpoolWork(pwork); //向線程池提交一個請求    WaitForThreadpoolWorkCallbacks(pwork, FALSE/*是否先嘗試取消提交的工作項目*/); //取消工作項目或等待完成    CloseThreadpoolWork(pwork); // 釋放工作項目記憶體    pwork = nullptr;    //每隔一段時間調用一個函數    PTP_TIMER ptimer = CreateThreadpoolTimer(TimerCB, nullptr, nullptr); //建立定時器    LARGE_INTEGER li;    li.QuadPart = -1ll;//立即開始    FILETIME duetime = { 0 };    duetime.dwLowDateTime = li.LowPart;     duetime.dwHighDateTime = li.HighPart;    SetThreadpoolTimer(ptimer, &duetime, 1/*再次調用的時間間隔*/, 0/*用來給回呼函數的執行時間增加一些隨機性*/); //設定定時器    WaitForThreadpoolTimerCallbacks(ptimer, FALSE); //調試發現,TimerCB沒機會執行,也沒有阻塞主線程啊!?    bres = IsThreadpoolTimerSet(ptimer); //檢查定時器狀態    //在核心對象觸發時調用一個函數    PTP_WAIT pwait = CreateThreadpoolWait(WaitCB, NULL, nullptr); //建立線程池等待對象    HANDLE hevent = CreateEvent(nullptr, FALSE, TRUE, nullptr);    SetThreadpoolWait(pwait, hevent, nullptr); //綁定到線程池    WaitForThreadpoolWaitCallbacks(pwait, FALSE);    //在非同步IO請求完成時調用一個函數    HANDLE hFile = CreateFile(TEXT("第11章 Windows線程池.cpp"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);    PTP_IO pio = CreateThreadpoolIo(hFile, IoCB, nullptr, nullptr); //建立線程池IO對象    char buf[_MAX_PATH] = { 0 };    OVERLAPPED ol = { 0 };    StartThreadpoolIo(pio); //每次IO調用之前,都要調用StartThreadpoolIo啟用線程池IO對象    bres = ReadFile(hFile, buf, _MAX_PATH, nullptr, &ol);    StartThreadpoolIo(pio);    bres = ReadFile(hFile, buf, _MAX_PATH, nullptr, &ol);    WaitForThreadpoolIoCallbacks(pio, FALSE);    StartThreadpoolIo(pio);    CancelThreadpoolIo(pio); //撤銷線程池IO對象    bres = ReadFile(hFile, buf, _MAX_PATH, nullptr, &ol);    system("pause");    SetThreadpoolTimer(ptimer, nullptr, 0, 0); //取消定時器    CloseThreadpoolTimer(ptimer);    ptimer = nullptr;    SetThreadpoolWait(pwait, nullptr, nullptr);    CloseThreadpoolWait(pwait);    pwait = nullptr;    CloseHandle(hevent);    hevent = nullptr;    //CloseThreadpoolIo(pio);  //調用CancelThreadpoolIo之後不用CloseThreadpoolIo了    pio = nullptr;    CloseHandle(hFile);    hFile = nullptr;    return 0;}

Windows核心編程:第11章 Windows線程池

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.