亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? privatebatch.cpp

?? Windows via C/C++, Fifth Edition圖書(shū)源代碼
?? CPP
字號(hào):
/******************************************************************************
Module:  PrivateBatch.cpp
Notices: Copyright (c) 2008 Jeffrey Richter & Christophe Nasarre
******************************************************************************/


#include "..\CommonFiles\CmnHdr.h"     /* See Appendix A. */
#include <Windowsx.h>
#include <WinBase.h>
#include <WinNT.h>


// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <strsafe.h>

#include "PrivateBatch.h"


//////////////////////////////////////////////////////////////////////////////


// Global variables
HWND                 g_hDlg = NULL;
PTP_POOL             g_pThreadPool = NULL;
TP_CALLBACK_ENVIRON  g_callbackEnvironment;
PTP_CLEANUP_GROUP    g_pCleanupGroup = NULL;
HANDLE               g_hPrintEvent = NULL;
HANDLE               g_hEmailEvent = NULL;


// Global definitions
#define WM_APP_COMPLETED (WM_APP+123)


//////////////////////////////////////////////////////////////////////////////


void AddMessage(PCTSTR pszFormat, ...) {

   va_list argList;
   va_start(argList, pszFormat);

   TCHAR szMsg[20 * 1024];
   _vstprintf_s(szMsg, _countof(szMsg), pszFormat, argList);
   HWND hListBox = GetDlgItem(g_hDlg, IDC_LB_STATUS);
   ListBox_SetCurSel(hListBox, ListBox_AddString(hListBox, szMsg));

   va_end(argList);
}


//////////////////////////////////////////////////////////////////////////////


typedef struct _CALLBACK_DATA
{
   HANDLE finishEvent;
   TCHAR szAction[MAX_PATH];
} CALLBACK_DATA, *PCALLBACK_DATA;


VOID ActionCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context) {

   PCALLBACK_DATA pData = (PCALLBACK_DATA)Context; 

   // Compute a pseudo duration for the action based on its name
   DWORD dwDuration = (DWORD)_tcslen(pData->szAction);

   AddMessage(
      TEXT("[%u] '%s' starting for %u seconds."), 
      GetCurrentThreadId(), pData->szAction, dwDuration);

   // Simulate a lot of work
   Sleep(dwDuration * 1000);

   AddMessage(
      TEXT("[%u] '%s' is done."), 
      GetCurrentThreadId(), pData->szAction);

   // Ask the thread pool to set the synchronization event 
   // after this callback finishes
   SetEventWhenCallbackReturns(Instance, pData->finishEvent);

   // Don't forget to clean up the given parameter data block
   delete (pData);
}


//////////////////////////////////////////////////////////////////////////////


typedef struct _SYNCHRO_DATA
{
   DWORD    Count;
   HANDLE*  Handles;
} SYNCHRO_DATA, *PSYNCHRO_DATA;

VOID EndOfBatchCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context) {

   PSYNCHRO_DATA pData = (PSYNCHRO_DATA)Context;
   
   AddMessage(
      TEXT("[%u] waiting for batch to finish"), GetCurrentThreadId()
      );

   DWORD BatchItemsCount = pData->Count;
   do {
      DWORD dwResult = 
         WaitForMultipleObjects(pData->Count, pData->Handles, FALSE, 1000);
      switch(dwResult) {
         case WAIT_TIMEOUT:
            // We could check against user cancellation or 
            // provide processing feedback
            break;

         default: // One of the action is finished
            BatchItemsCount--;
            break;
      }
   } while (BatchItemsCount > 0);

   // Notify the UI thread for completion
   PostMessage(g_hDlg, WM_APP_COMPLETED, 0, (LPARAM)pData);
}


//////////////////////////////////////////////////////////////////////////////


void OnStartBatch() {

   // Sanity checks
   if (g_hEmailEvent != NULL)
   {
      AddMessage(TEXT("Previous batch is still running..."));
      return;
   }

   AddMessage(
      TEXT("[%u] ----Start a new batch----"), GetCurrentThreadId());
   
   // Create the synchronization events
   g_hEmailEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("EmailEvent"));
   g_hPrintEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("PrintEvent"));

   // Define the work items to be processed by the thread pool
   // 1. Keep track of the events that will be set when each action 
   //    if finished
   PSYNCHRO_DATA pSynchData = new SYNCHRO_DATA();
   pSynchData->Count = 2;
   pSynchData->Handles = new HANDLE[2];
   pSynchData->Handles[0] = g_hEmailEvent;
   pSynchData->Handles[1] = g_hPrintEvent;
   TrySubmitThreadpoolCallback((PTP_SIMPLE_CALLBACK)
      EndOfBatchCallback, pSynchData, &g_callbackEnvironment);

   // 2. Start the email action
   PCALLBACK_DATA pData = new CALLBACK_DATA();
   pData->finishEvent = g_hEmailEvent;
   _tcscpy_s(pData->szAction, MAX_PATH, TEXT("Email"));
   TrySubmitThreadpoolCallback((PTP_SIMPLE_CALLBACK)
      ActionCallback, pData, &g_callbackEnvironment);
   
   // 3. Start the printing action
   pData = new CALLBACK_DATA();
   pData->finishEvent = g_hPrintEvent;
   _tcscpy_s(pData->szAction, MAX_PATH, TEXT("Printing"));
   TrySubmitThreadpoolCallback((PTP_SIMPLE_CALLBACK)
      ActionCallback, pData, &g_callbackEnvironment);
}


//////////////////////////////////////////////////////////////////////////////


int lastWorkTime = 0;

VOID SimpleHandler(PTP_CALLBACK_INSTANCE Instance, PVOID Context) {

   // Ensure not bad random
   int workTime = ((rand() % 4) +1);
   while (workTime == lastWorkTime) {
      workTime = ((rand() % 4) +1);
   }
   lastWorkTime = workTime;
   
   AddMessage(
      TEXT("[%u] '%s' starting for %u seconds."), 
      GetCurrentThreadId(), (PCTSTR)Context, workTime);

   // Simulate a lot of work
   Sleep(workTime * 1000);

   AddMessage(
      TEXT("[%u] Instant '%s' is done."), 
      GetCurrentThreadId(), (PCTSTR)Context);

   delete ((PTSTR)Context);
}


//////////////////////////////////////////////////////////////////////////////


void OnRun() {

   // Setup randomizer
   srand(GetTickCount());
   
   for(int current = 1; current <= 6; current++) {
      PTSTR pRequest = new TCHAR[MAX_PATH];
      StringCchPrintf(pRequest, MAX_PATH, TEXT("Request %u"), current);
      if (TrySubmitThreadpoolCallback((PTP_SIMPLE_CALLBACK)
         SimpleHandler, pRequest, &g_callbackEnvironment))
      {
         AddMessage(
            TEXT("[%u] Request %u is submitted"), 
            GetCurrentThreadId(), current);
      } else {
         AddMessage(
            TEXT("[%u] Request %u can't be submitted"), 
            GetCurrentThreadId(), current);
      }
   }
}


//////////////////////////////////////////////////////////////////////////////


void OnDeletePool() {

   // Note: DestroyThreadpoolEnvironment() in winbase.h
   //       calls TpDestroyCallbackEnviron() in winnt.h 
   //       that does... nothing
   //       So, we need to destroy the thread pool ourself
   if (g_pThreadPool != NULL) {
      CloseThreadpool(g_pThreadPool);
   }

   // Clean up callback environment; maybe useful in next version
   // See previous comment
   DestroyThreadpoolEnvironment(&g_callbackEnvironment);
}


void OnCreatePool() {

   // Sanity checks
   if (g_pThreadPool != NULL) {
      OnDeletePool();
   }
   
   // Initialize the private thread pool
   g_pThreadPool = CreateThreadpool(NULL);
   if (g_pThreadPool == NULL) {
      MessageBox(
         NULL, 
         TEXT("Impossible to create private thread pool"), 
         TEXT("Initialization error"), 
         MB_ICONERROR | MB_OK
         );
      return;
   }

   // Change  min=2 / max=4 thread pool parameters
   SetThreadpoolThreadMaximum(g_pThreadPool, 4);
   if (!SetThreadpoolThreadMinimum(g_pThreadPool, 2)) {
      MessageBox(
         NULL, 
         TEXT("SetThreadpoolThreadMinimum failed."), 
         TEXT("Initialization error"), 
         MB_ICONERROR | MB_OK
         );
      return;
   }

   // Reset the callback environment
   // Note: this is an inline function from winbase.h
   //       that calls TpInitializeCallbackEnviron() in winnt.h.
   //       --> 
   //       CallbackEnviron->Version = 1;
   //       CallbackEnviron->Pool = NULL;
   //       CallbackEnviron->CleanupGroup = NULL;
   //       CallbackEnviron->CleanupGroupCancelCallback = NULL;
   //       CallbackEnviron->RaceDll = NULL;
   //       CallbackEnviron->ActivationContext = NULL;
   //       CallbackEnviron->FinalizationCallback = NULL;
   //       CallbackEnviron->u.Flags = 0;
   InitializeThreadpoolEnvironment(&g_callbackEnvironment);

   // Associate our private thread pool with the callback environment
   // Note: this is an inline function from winbase.h
   //       that calls TpSetCallbackThreadpool() in winnt.h.
   //       --> 
   //       CallbackEnviron->Pool = Pool;
   SetThreadpoolCallbackPool(&g_callbackEnvironment, g_pThreadPool);  
}


//////////////////////////////////////////////////////////////////////////////


void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) {

   switch (id) {
      case IDOK:
      case IDCANCEL:
         EndDialog(hwnd, id);
         break;

      case IDC_BTN_START_BATCH:
         OnStartBatch();
         break;

      case IDC_BTN_CREATE_POOL:
         OnCreatePool();
         break;

      case IDC_BTN_RUN:
         OnRun();
         break;

      case IDC_BTN_DELETE_POOL:
         OnDeletePool();
         break;
   }
}


BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) {

   // Keep track of main dialog window for error messages.
   g_hDlg = hwnd;

   return(TRUE);
}


INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

   switch (uMsg) {
      chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
      chHANDLE_DLGMSG(hwnd, WM_COMMAND,    Dlg_OnCommand);
      case WM_APP_COMPLETED:
      {
         AddMessage(
            TEXT("[%u] ____Whole batch is over____"), 
            GetCurrentThreadId());

         // Don't forget to clean up given synchronization data
         PSYNCHRO_DATA pData = (PSYNCHRO_DATA)lParam;
         for (DWORD current = 0; current < pData->Count; current++) {
            if (!CloseHandle(pData->Handles[current])) {
               AddMessage(
                  TEXT("[%u] Error %u when closing handle %u"), 
                  GetCurrentThreadId(), GetLastError(), current);
            }
         }
         g_hEmailEvent = NULL;
         g_hPrintEvent = NULL;
         delete (pData);
      }
      break;
   }

   return(FALSE);
}


//////////////////////////////////////////////////////////////////////////////


int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
   UNREFERENCED_PARAMETER(hPrevInstance);
   UNREFERENCED_PARAMETER(lpCmdLine);

   DialogBoxParam(
      hInstance, 
      MAKEINTRESOURCE(IDD_MAIN), 
      NULL, 
      Dlg_Proc, 
      _ttoi(lpCmdLine)
      );

   return(0);
}


//////////////////////////////// End of File /////////////////////////////////

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
性感美女久久精品| 在线精品观看国产| 天堂久久一区二区三区| 亚洲精品国产精品乱码不99| 国产精品国产三级国产三级人妇 | 亚洲精品一区二区在线观看| 在线综合视频播放| 欧美久久久一区| 555www色欧美视频| 欧美第一区第二区| 国产欧美视频在线观看| 国产精品久久久久久妇女6080 | 91精品在线观看入口| 欧美日韩高清一区| 69堂国产成人免费视频| 精品国产制服丝袜高跟| 中文一区二区完整视频在线观看| 国产精品久久夜| 亚洲激情自拍偷拍| 日韩精品亚洲一区二区三区免费| 老司机精品视频线观看86 | 一本久道久久综合中文字幕| 欧美日韩国产成人在线91| 精品国产免费一区二区三区四区 | 亚洲 欧美综合在线网络| 男女激情视频一区| 97精品久久久午夜一区二区三区 | 日韩成人免费看| 高清av一区二区| 欧美视频一区二区在线观看| 精品国产青草久久久久福利| 亚洲人成小说网站色在线| 美女mm1313爽爽久久久蜜臀| av电影在线观看一区| 日韩欧美在线一区二区三区| 亚洲欧洲精品天堂一级| 免费高清在线一区| 色噜噜狠狠成人中文综合| 亚洲精品在线三区| 亚洲成人动漫av| caoporm超碰国产精品| 日韩你懂的在线观看| 亚洲国产日产av| 成人性生交大合| 精品国产污污免费网站入口| 亚洲高清不卡在线观看| av中文字幕不卡| www久久久久| 奇米888四色在线精品| 色婷婷国产精品| 国产精品久久久久久久久搜平片| 日本aⅴ免费视频一区二区三区| 97久久超碰精品国产| 国产日产精品一区| 国产在线观看免费一区| 日韩欧美激情四射| 日本欧美一区二区三区乱码| 日本精品视频一区二区| 国产精品美女一区二区| 国产在线精品一区二区| 欧美一区日韩一区| 日韩成人一区二区| 欧美精品一二三四| 肉丝袜脚交视频一区二区| 欧美午夜在线观看| 亚洲国产sm捆绑调教视频| 在线观看91视频| 亚洲三级在线免费观看| 91色porny蝌蚪| 亚洲欧美国产三级| 91国内精品野花午夜精品| 亚洲免费色视频| 在线视频一区二区三| 亚洲国产精品久久艾草纯爱| 欧美视频在线播放| 亚洲va天堂va国产va久| 3751色影院一区二区三区| 爽爽淫人综合网网站| 欧美一区二区三区免费视频| 久久国产精品99久久久久久老狼| 日韩欧美的一区二区| 国产一区不卡视频| 欧美高清在线一区二区| eeuss鲁片一区二区三区在线观看| 日本一区二区在线不卡| 色综合久久久久综合| 亚洲成人av一区二区三区| 欧美精品18+| 韩国理伦片一区二区三区在线播放| 久久久三级国产网站| 成人国产精品视频| 午夜在线电影亚洲一区| 精品日韩在线观看| 99久久免费精品| 秋霞午夜鲁丝一区二区老狼| 久久品道一品道久久精品| 91在线porny国产在线看| 亚洲高清在线精品| 久久久国产精品午夜一区ai换脸| 成人高清在线视频| 亚洲成av人片| 欧美国产在线观看| 欧美日韩和欧美的一区二区| 极品美女销魂一区二区三区 | 精品一二三四在线| 中文字幕五月欧美| 日韩精品一区二区三区四区| 成人h动漫精品一区二区| 亚洲电影第三页| 亚洲国产岛国毛片在线| 欧美色图12p| 成人免费视频网站在线观看| 午夜av电影一区| 最近日韩中文字幕| 精品国产一区二区在线观看| 91九色02白丝porn| 国产成人午夜精品5599| 五月天视频一区| 亚洲欧美日韩电影| 久久久久久久性| 欧美一区二区视频在线观看2022| 91亚洲精品一区二区乱码| 久久精品99国产精品| 亚欧色一区w666天堂| 亚洲欧美日韩一区二区三区在线观看| 日韩美女视频一区二区在线观看| 色婷婷综合久久久| eeuss国产一区二区三区| 精品亚洲国内自在自线福利| 亚洲成人激情av| 亚洲欧美另类图片小说| 中文字幕免费不卡在线| 国产喂奶挤奶一区二区三区| 日韩片之四级片| 欧美精品一卡两卡| 欧美喷潮久久久xxxxx| 日本二三区不卡| a4yy欧美一区二区三区| 成人中文字幕在线| 国产999精品久久| 国产91对白在线观看九色| 久久成人18免费观看| 久久精品国产澳门| 免费观看在线色综合| 美国十次综合导航| 久久爱www久久做| 久久91精品国产91久久小草| 精品写真视频在线观看| 国产一区二区影院| 国产高清不卡一区二区| 东方欧美亚洲色图在线| 国产成人精品免费视频网站| 粉嫩av一区二区三区粉嫩| 国产成人日日夜夜| 成人av影院在线| 91在线看国产| 欧美性猛片aaaaaaa做受| 欧美日韩视频在线观看一区二区三区| 在线观看国产日韩| 欧美一区午夜视频在线观看| 日韩精品一区二区三区三区免费| 精品国产伦一区二区三区免费| 2024国产精品| 国产精品少妇自拍| 亚洲图片有声小说| 久草热8精品视频在线观看| 国内成人精品2018免费看| 国产99久久久国产精品潘金| 色综合天天综合在线视频| 欧日韩精品视频| 欧美一区二区不卡视频| 国产亲近乱来精品视频| 亚洲精品国产精华液| 日韩av午夜在线观看| 国产成人午夜精品5599| 欧美中文字幕一区| 日韩亚洲欧美成人一区| 中文乱码免费一区二区| 亚洲午夜精品在线| 国产精品一级二级三级| 色综合久久久久| 精品美女一区二区| 一区二区免费看| 精品一区二区三区日韩| 色综合天天视频在线观看| 日韩免费高清视频| 亚洲精品国产精华液| 国产一区二区三区不卡在线观看| 白白色 亚洲乱淫| 欧美一卡二卡在线| 亚洲日本电影在线| 久久97超碰国产精品超碰| 91麻豆精品一区二区三区| 日韩午夜电影av| 亚洲天堂免费在线观看视频| 美国十次综合导航| 欧美高清www午色夜在线视频| 欧美激情综合五月色丁香小说| 五月婷婷综合激情| 不卡区在线中文字幕|