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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? waitformultexp.cpp

?? c++的經(jīng)典之作.是不可缺少的工具.大家可以現(xiàn)在學(xué)習(xí)
?? CPP
字號:
/******************************************************************************
Module:  WaitForMultExp.cpp
Notices: Copyright (c) 2000 Jeffrey Richter
******************************************************************************/


#include "..\CmnHdr.h"     /* See Appendix A. */
#include <malloc.h>
#include <process.h>
#include "WaitForMultExp.h"


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


// Internal data structure representing a single expression.
// Used to tell OR-threads what objects to wait on.
typedef struct {
   PHANDLE m_phExpObjects;   // Points to set of handles
   DWORD   m_nExpObjects;    // Number of handles
} EXPRESSION, *PEXPRESSION;


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


// The OR-thread function
DWORD WINAPI WFME_ThreadExpression(PVOID pvParam) {

   // This thread function just waits for an expression to come true. 
   // The thread waits in an alertable state so that it can be forced
   // to stop waiting by queuing an entry to its APC queue.
   PEXPRESSION pExpression = (PEXPRESSION) pvParam;
   return(WaitForMultipleObjectsEx(
      pExpression->m_nExpObjects, pExpression->m_phExpObjects, 
      TRUE, INFINITE, TRUE));
}


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


// This is the APC callback routine function
VOID WINAPI WFME_ExpressionAPC(ULONG_PTR dwData) {

   // This function intentionally left blank
}


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


// Function to wait on mutiple Boolean expressions
DWORD WINAPI WaitForMultipleExpressions(DWORD nExpObjects, 
   CONST HANDLE* phExpObjects, DWORD dwMilliseconds) {

   // Allocate a temporary array because we modify the passed array and
   // we need to add a handle at the end for the hsemOnlyOne semaphore.
   PHANDLE phExpObjectsTemp = (PHANDLE)
      _alloca(sizeof(HANDLE) * (nExpObjects + 1));
   CopyMemory(phExpObjectsTemp, phExpObjects, sizeof(HANDLE) * nExpObjects);
   phExpObjectsTemp[nExpObjects] = NULL;  // Put sentinel at end

   // Semaphore to guarantee that only one expression gets satisfied
   HANDLE hsemOnlyOne = CreateSemaphore(NULL, 1, 1, NULL);
   
   // Expression information: 1 per possible thread
   EXPRESSION Expression[MAXIMUM_WAIT_OBJECTS];

   DWORD dwExpNum  = 0;    // Current expression number
   DWORD dwNumExps = 0;    // Total number of expressions

   DWORD dwObjBegin = 0;   // First index of a set
   DWORD dwObjCur   = 0;   // Current index of object in a set

   DWORD dwThreadId, dwWaitRet = 0;

   // Array of thread handles for threads: 1 per expression
   HANDLE ahThreads[MAXIMUM_WAIT_OBJECTS];

   // Parse the callers handle list by initializing a structure for
   // each expression and adding hsemOnlyOne to each expression.
   while ((dwWaitRet != WAIT_FAILED) && (dwObjCur <= nExpObjects)) {

      // While no errors, and object handles are in the caller's list...

      // Find next expression (OR-expressions are separated by NULL handles)
      while (phExpObjectsTemp[dwObjCur] != NULL) 
         dwObjCur++;
      
      // Initialize Expression structure which an OR-thread waits on
      phExpObjectsTemp[dwObjCur] = hsemOnlyOne;
      Expression[dwNumExps].m_phExpObjects =  &phExpObjectsTemp[dwObjBegin];
      Expression[dwNumExps].m_nExpObjects  =  dwObjCur - dwObjBegin + 1;

      if (Expression[dwNumExps].m_nExpObjects > MAXIMUM_WAIT_OBJECTS) {
         // Error: Too many handles in single expression
         dwWaitRet = WAIT_FAILED;
         SetLastError(ERROR_SECRET_TOO_LONG);
      }

      // Advance to the next expression
      dwObjBegin = ++dwObjCur;
      if (++dwNumExps == MAXIMUM_WAIT_OBJECTS) {
         // Error: Too many expressions
         dwWaitRet = WAIT_FAILED;
         SetLastError(ERROR_TOO_MANY_SECRETS);
      }
   }

   if (dwWaitRet != WAIT_FAILED) {

      // No errors occurred while parsing the handle list

      // Spawn thread to wait on each expression
      for (dwExpNum = 0; dwExpNum < dwNumExps; dwExpNum++) {

         ahThreads[dwExpNum] = chBEGINTHREADEX(NULL, 
            1, // We only require a small stack
            WFME_ThreadExpression, &Expression[dwExpNum], 
            0, &dwThreadId);
      }

      // Wait for an expression to come TRUE or for a timeout
      dwWaitRet = WaitForMultipleObjects(dwExpNum, ahThreads, 
         FALSE, dwMilliseconds);

      if (WAIT_TIMEOUT == dwWaitRet) {

         // We timed-out, check if any expressions were satisfied by 
         // checking the state of the hsemOnlyOne semaphore.
         dwWaitRet = WaitForSingleObject(hsemOnlyOne, 0);

         if (WAIT_TIMEOUT == dwWaitRet) {

            // If the semaphore was not signaled, some thread expressions
            // was satisfied; we need to determine which expression.
            dwWaitRet = WaitForMultipleObjects(dwExpNum, 
               ahThreads, FALSE, INFINITE);

         } else {

            // No expression was satisfied and WaitForSingleObject just gave
            // us the semaphore so we know that no expression can ever be 
            // satisfied now -- waiting for an expression has timed-out.
            dwWaitRet = WAIT_TIMEOUT;
         }
      }

      // Break all the waiting expression threads out of their 
      // wait state so that they can terminate cleanly.
      for (dwExpNum = 0; dwExpNum < dwNumExps; dwExpNum++) {

         if ((WAIT_TIMEOUT == dwWaitRet) || 
             (dwExpNum != (dwWaitRet - WAIT_OBJECT_0))) {

            QueueUserAPC(WFME_ExpressionAPC, ahThreads[dwExpNum], 0);
         }
      }

#ifdef _DEBUG
      // In debug builds, wait for all of expression threads to terminate 
      // to make sure that we are forcing the threads to wake up. 
      // In non-debug builds, we'll assume that this works and 
      // not keep this thread waiting any longer.
      WaitForMultipleObjects(dwExpNum, ahThreads, TRUE, INFINITE);
#endif

      // Close our handles to all the expression threads
      for (dwExpNum = 0; dwExpNum < dwNumExps; dwExpNum++) {
         CloseHandle(ahThreads[dwExpNum]);
      }
   }  // error occurred while parsing

   CloseHandle(hsemOnlyOne);
   return(dwWaitRet);
}


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

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www激情久久| 91丨porny丨蝌蚪视频| 欧美午夜一区二区| 亚洲综合久久av| 色悠悠久久综合| 亚洲精品va在线观看| 在线看一区二区| 天使萌一区二区三区免费观看| 精品视频在线免费观看| 日韩av午夜在线观看| 精品国产一区二区三区久久影院| 国内精品伊人久久久久av影院| 久久综合久久99| 成人av网址在线| 亚洲美女屁股眼交3| 欧美老肥妇做.爰bbww| 蜜桃在线一区二区三区| 国产女主播视频一区二区| 91免费看`日韩一区二区| 亚洲国产成人va在线观看天堂| 在线综合亚洲欧美在线视频| 国产一区二区三区黄视频 | 99久久久精品免费观看国产蜜| 成人免费在线观看入口| 欧美群妇大交群中文字幕| 久久99热这里只有精品| 国产精品对白交换视频| 在线电影国产精品| 国产成人在线色| 亚洲妇女屁股眼交7| 久久蜜桃av一区二区天堂| 91女人视频在线观看| 日本中文字幕一区二区有限公司| 国产婷婷精品av在线| 欧美性色aⅴ视频一区日韩精品| 精品一区二区三区蜜桃| 亚洲制服丝袜av| 国产欧美日韩麻豆91| 欧美日韩高清一区二区三区| 国产91在线观看| 日韩—二三区免费观看av| **性色生活片久久毛片| 欧美www视频| 色综合中文字幕| 国产乱人伦偷精品视频不卡| 石原莉奈在线亚洲三区| 17c精品麻豆一区二区免费| 精品国产伦一区二区三区观看方式| 91在线播放网址| 懂色av中文字幕一区二区三区| 日韩av在线发布| 亚洲一区二区三区四区在线| 国产精品久久久久9999吃药| 亚洲精品在线免费观看视频| 欧美日本一区二区三区四区| 99久久免费视频.com| 国产成人午夜精品5599| 免费欧美高清视频| 石原莉奈在线亚洲二区| 亚洲一区二区四区蜜桃| 亚洲欧美激情一区二区| 国产精品萝li| 国产精品美女一区二区| 久久精品综合网| 久久午夜电影网| www国产亚洲精品久久麻豆| 欧美成人精品3d动漫h| 91.com视频| 91精品欧美福利在线观看| 欧美日韩精品系列| 欧美日韩亚洲综合在线| 在线区一区二视频| 欧美三区在线视频| 欧美喷潮久久久xxxxx| 91久久精品国产91性色tv| 91视视频在线观看入口直接观看www | 国产精品国产三级国产aⅴ原创| 26uuu国产电影一区二区| 欧美成人精品福利| 亚洲精品一区二区三区精华液 | 在线播放/欧美激情| 欧美日本在线播放| 欧美一级在线观看| 精品国产免费视频| 精品99一区二区三区| 久久噜噜亚洲综合| 欧美国产精品v| 国产精品久99| 日韩美女视频一区二区| 亚洲精品第一国产综合野| 亚洲综合色视频| 丝袜国产日韩另类美女| 久久国产生活片100| 国产乱码精品一区二区三区忘忧草| 国产精一品亚洲二区在线视频| 国产精品自拍在线| av综合在线播放| 欧美伊人精品成人久久综合97| 欧美日韩高清一区二区| 91精品国产色综合久久久蜜香臀| 欧美成人伊人久久综合网| 久久精品视频免费观看| 亚洲视频 欧洲视频| 日韩国产在线观看| 久久99精品国产.久久久久久| 国产精品亚洲综合一区在线观看| av午夜精品一区二区三区| 在线精品视频免费播放| 欧美不卡视频一区| 国产精品国产三级国产| 午夜精品成人在线视频| 国产资源在线一区| 色婷婷综合久久久中文字幕| 日韩精品一区二区三区视频| 国产精品网站导航| 亚洲电影第三页| 国产成人精品一区二| 欧美日韩你懂得| 国产网红主播福利一区二区| 亚洲精品少妇30p| 国产伦精品一区二区三区免费迷 | 亚洲天堂福利av| 看片的网站亚洲| 一本一道久久a久久精品综合蜜臀| 欧美精品精品一区| 国产精品乱码久久久久久| 视频在线观看国产精品| 成人丝袜18视频在线观看| 337p亚洲精品色噜噜| 一区在线播放视频| 黄色成人免费在线| 欧美日韩亚洲综合| 亚洲欧美一区二区三区国产精品| 久久99热狠狠色一区二区| 欧美午夜一区二区三区免费大片| 国产日韩欧美综合一区| 天天免费综合色| 99久久久无码国产精品| 国产欧美一区二区精品仙草咪| 亚洲成va人在线观看| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 日韩欧美综合在线| 亚洲欧美福利一区二区| 国产剧情一区二区三区| 91精品国产aⅴ一区二区| 亚洲你懂的在线视频| 成人丝袜高跟foot| 久久久久久亚洲综合| 麻豆久久一区二区| 欧美日韩精品电影| 一区二区免费视频| 91热门视频在线观看| 国产精品久久福利| 成人性生交大片免费看视频在线| 精品国内片67194| 久久99精品久久久久久久久久久久| 欧美日韩aaaaa| 香蕉影视欧美成人| 91国在线观看| 亚洲三级电影网站| 99精品国产热久久91蜜凸| 中文一区一区三区高中清不卡| 国产精品一二三四五| 久久综合av免费| 国产曰批免费观看久久久| 日韩女优av电影| 精品一区二区三区视频在线观看| 日韩一本二本av| 麻豆成人av在线| 久久人人超碰精品| 国产精品夜夜嗨| 亚洲欧洲成人自拍| 91国偷自产一区二区开放时间 | 亚洲欧洲日韩女同| 99久久久久免费精品国产| 亚洲同性同志一二三专区| 99精品在线观看视频| 亚洲人成精品久久久久| 欧美日韩综合色| 日本不卡一区二区三区高清视频| 欧美一区二区在线播放| 久久国产精品第一页| 国产精品理伦片| 91色在线porny| 亚洲妇女屁股眼交7| 欧美一区二区三区色| 国精产品一区一区三区mba视频| 国产清纯美女被跳蛋高潮一区二区久久w| 国产精品一区免费视频| 中文字幕亚洲区| 欧美精品丝袜中出| 国产一本一道久久香蕉| 中文字幕日本不卡| 欧美日韩国产免费一区二区 | 69堂精品视频| 国产呦萝稀缺另类资源| 亚洲欧洲美洲综合色网| 欧美天堂一区二区三区| 久久精品72免费观看| 国产精品网友自拍|