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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? queue.cpp

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


#include "..\CommonFiles\CmnHdr.h"     /* See Appendix A. */
#include <windowsx.h>
#include <tchar.h>
#include <StrSafe.h>
#include "Resource.h"


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


class CQueue {
public:
   struct ELEMENT {
      int m_nThreadNum, m_nRequestNum;
      // Other element data should go here
   };
   typedef ELEMENT* PELEMENT;

private:
   PELEMENT m_pElements;        // Array of elements to be processed
   int      m_nMaxElements;     // Maximum # of elements in the array
   HANDLE   m_h[2];             // Mutex & semaphore handles
   HANDLE   &m_hmtxQ;           // Reference to m_h[0]
   HANDLE   &m_hsemNumElements; // Reference to m_h[1]

public:
   CQueue(int nMaxElements);
   ~CQueue();

   BOOL Append(PELEMENT pElement, DWORD dwMilliseconds);
   BOOL Remove(PELEMENT pElement, DWORD dwMilliseconds);
};


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


CQueue::CQueue(int nMaxElements) 
   : m_hmtxQ(m_h[0]), m_hsemNumElements(m_h[1]) {

   m_pElements = (PELEMENT) 
      HeapAlloc(GetProcessHeap(), 0, sizeof(ELEMENT) * nMaxElements);
   m_nMaxElements = nMaxElements;
   m_hmtxQ = CreateMutex(NULL, FALSE, NULL);
   m_hsemNumElements = CreateSemaphore(NULL, 0, nMaxElements, NULL);
}


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


CQueue::~CQueue() {

   CloseHandle(m_hsemNumElements);
   CloseHandle(m_hmtxQ);
   HeapFree(GetProcessHeap(), 0, m_pElements);
}


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


BOOL CQueue::Append(PELEMENT pElement, DWORD dwTimeout) {

   BOOL fOk = FALSE;
   DWORD dw = WaitForSingleObject(m_hmtxQ, dwTimeout);

   if (dw == WAIT_OBJECT_0) {
      // This thread has exclusive access to the queue

      // Increment the number of elements in the queue
      LONG lPrevCount;
      fOk = ReleaseSemaphore(m_hsemNumElements, 1, &lPrevCount);
      if (fOk) {
         // The queue is not full, append the new element
         m_pElements[lPrevCount] = *pElement;
      } else {

         // The queue is full, set the error code and return failure
         SetLastError(ERROR_DATABASE_FULL);
      }

      // Allow other threads to access the queue
      ReleaseMutex(m_hmtxQ);

   } else {
      // Timeout, set error code and return failure
      SetLastError(ERROR_TIMEOUT);
   }

   return(fOk);   // Call GetLastError for more info
}


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


BOOL CQueue::Remove(PELEMENT pElement, DWORD dwTimeout) {

   // Wait for exclusive access to queue and for queue to have element.
   BOOL fOk = (WaitForMultipleObjects(_countof(m_h), m_h, TRUE, dwTimeout) 
      == WAIT_OBJECT_0);

   if (fOk) {
      // The queue has an element, pull it from the queue
      *pElement = m_pElements[0];

      // Shift the remaining elements down
      MoveMemory(&m_pElements[0], &m_pElements[1], 
         sizeof(ELEMENT) * (m_nMaxElements - 1));

      // Allow other threads to access the queue
      ReleaseMutex(m_hmtxQ);

   } else {
      // Timeout, set error code and return failure
      SetLastError(ERROR_TIMEOUT);
   }

   return(fOk);   // Call GetLastError for more info
}


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


CQueue g_q(10);                     // The shared queue
volatile LONG g_fShutdown = FALSE;  // Signals client/server threads to die
HWND g_hwnd;                        // How client/server threads give status


// Handles to all client/server threads & number of client/server threads
HANDLE g_hThreads[MAXIMUM_WAIT_OBJECTS];  
int    g_nNumThreads = 0;


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


DWORD WINAPI ClientThread(PVOID pvParam) {

   int nThreadNum = PtrToUlong(pvParam);
   HWND hwndLB = GetDlgItem(g_hwnd, IDC_CLIENTS);

   int nRequestNum = 0;
   while (1 != InterlockedCompareExchange(&g_fShutdown, 0, 0)) {

      // Keep track of the current processed element
      nRequestNum++;
      
      TCHAR sz[1024];
      CQueue::ELEMENT e = { nThreadNum, nRequestNum };

      // Try to put an element on the queue
      if (g_q.Append(&e, 200)) {

         // Indicate which thread sent it and which request
         StringCchPrintf(sz, _countof(sz), TEXT("Sending %d:%d"), 
            nThreadNum, nRequestNum);
      } else {

         // Couldn't put an element on the queue
         StringCchPrintf(sz, _countof(sz), TEXT("Sending %d:%d (%s)"), 
            nThreadNum, nRequestNum, (GetLastError() == ERROR_TIMEOUT) 
               ? TEXT("timeout") : TEXT("full"));
      }

      // Show result of appending element
      ListBox_SetCurSel(hwndLB, ListBox_AddString(hwndLB, sz));
      Sleep(2500);   // Wait before appending another element
   }
   
   return(0);
}


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


DWORD WINAPI ServerThread(PVOID pvParam) {

   int nThreadNum = PtrToUlong(pvParam);
   HWND hwndLB = GetDlgItem(g_hwnd, IDC_SERVERS);

   while (1 != InterlockedCompareExchange(&g_fShutdown, 0, 0)) {

      TCHAR sz[1024];
      CQueue::ELEMENT e;

      // Try to get an element from the queue
      if (g_q.Remove(&e, 5000)) {

         // Indicate which thread is processing it, which thread
         // sent it and which request we're processing
         StringCchPrintf(sz, _countof(sz), TEXT("%d: Processing %d:%d"), 
            nThreadNum, e.m_nThreadNum, e.m_nRequestNum);

         // The server takes some time to process the request
         Sleep(2000 * e.m_nThreadNum);

      } else {
         // Couldn't get an element from the queue
         StringCchPrintf(sz, _countof(sz), TEXT("%d: (timeout)"), nThreadNum);
      }

      // Show result of processing element
      ListBox_SetCurSel(hwndLB, ListBox_AddString(hwndLB, sz));
   }

   return(0);
}


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


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

   chSETDLGICONS(hwnd, IDI_QUEUE);

   g_hwnd = hwnd; // Used by client/server threads to show status

   DWORD dwThreadID;

   // Create the client threads
   for (int x = 0; x < 4; x++)
      g_hThreads[g_nNumThreads++] = 
         chBEGINTHREADEX(NULL, 0, ClientThread, (PVOID) (INT_PTR) x, 
            0, &dwThreadID);

   // Create the server threads
   for (int x = 0; x < 2; x++)
      g_hThreads[g_nNumThreads++] = 
         chBEGINTHREADEX(NULL, 0, ServerThread, (PVOID) (INT_PTR) x, 
            0, &dwThreadID);

   return(TRUE);
}


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


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

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


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


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);
   }
   return(FALSE);
}


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


int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {

   DialogBox(hinstExe, MAKEINTRESOURCE(IDD_QUEUE), NULL, Dlg_Proc);
   InterlockedExchange(&g_fShutdown, TRUE);

   // Wait for all the threads to terminate & then cleanup
   WaitForMultipleObjects(g_nNumThreads, g_hThreads, TRUE, INFINITE);
   while (g_nNumThreads--)
      CloseHandle(g_hThreads[g_nNumThreads]);

   return(0);
}


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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲妇熟xx妇色黄| 亚洲电影中文字幕在线观看| 91精品在线免费| 欧美日韩一二区| 在线91免费看| 精品国偷自产国产一区| 国产亚洲欧美激情| 中文字幕亚洲一区二区va在线| 国产精品三级久久久久三级| 最近日韩中文字幕| 亚洲福利电影网| 美女视频一区在线观看| 国内外成人在线| zzijzzij亚洲日本少妇熟睡| 91麻豆产精品久久久久久| 欧美日韩日日夜夜| 亚洲精品在线免费播放| 国产精品视频一区二区三区不卡 | 一二三四社区欧美黄| 一区二区三区在线看| 五月婷婷色综合| 国产乱码精品一品二品| 色婷婷亚洲综合| 欧美一卡2卡3卡4卡| 国产午夜精品一区二区| 亚洲精品高清在线| 麻豆精品一区二区综合av| 国产精品99久久久久| 在线中文字幕一区| 久久男人中文字幕资源站| 亚洲精选视频在线| 韩国女主播一区| 91国偷自产一区二区三区成为亚洲经典| 欧美日本乱大交xxxxx| 亚洲精品一线二线三线无人区| 亚洲桃色在线一区| 国产在线视频不卡二| 在线观看国产91| 久久先锋影音av鲁色资源网| 亚洲精品视频在线观看免费| 精品一区二区三区在线播放 | 亚洲一区二区三区激情| 国产在线视频精品一区| 欧美视频你懂的| 欧美国产亚洲另类动漫| 久久精品72免费观看| 91国产免费观看| 中文一区一区三区高中清不卡| 午夜av区久久| 91视频在线观看免费| 日本一区二区高清| 精品亚洲成a人| 91精品国产黑色紧身裤美女| 亚洲少妇中出一区| 不卡视频一二三四| 日本一区二区三区免费乱视频| 香蕉加勒比综合久久| 91色在线porny| 国产精品电影一区二区| 国产成人av福利| 久久亚洲综合色| 久久精品免费观看| 91精品国产一区二区| 手机精品视频在线观看| 欧美日韩一区成人| 亚洲成人一区二区| 欧美日本在线播放| 香蕉av福利精品导航| 欧美制服丝袜第一页| 一区二区三区小说| 在线视频欧美精品| 亚洲图片一区二区| 欧美精品视频www在线观看| 亚洲午夜久久久| 欧美日韩亚洲综合在线 | 国产电影一区二区三区| 精品国产99国产精品| 国产真实精品久久二三区| 久久久亚洲午夜电影| 粉嫩13p一区二区三区| 中文字幕一区三区| 91浏览器在线视频| 午夜精品久久久| 91精品视频网| 久久99国产精品久久99| 久久久久国产精品人| 成人午夜电影小说| 亚洲欧美另类图片小说| 欧美日韩黄色影视| 另类成人小视频在线| 中文字幕第一区二区| 91影视在线播放| 亚洲福利一二三区| 久久综合久色欧美综合狠狠| 成人免费福利片| 一区二区三区免费在线观看| 91 com成人网| 国产suv精品一区二区883| 亚洲欧美一区二区在线观看| 欧美亚洲丝袜传媒另类| 日本不卡不码高清免费观看| 久久久九九九九| 在线免费精品视频| 国产麻豆成人精品| 亚洲精品国产视频| 精品欧美乱码久久久久久1区2区| 成人动漫一区二区在线| 首页国产欧美日韩丝袜| 中文av一区二区| 不卡一区二区在线| 婷婷夜色潮精品综合在线| 久久久久久久久久久久久夜| 欧洲一区二区三区在线| 国产在线不卡视频| 亚洲电影你懂得| 国产精品视频在线看| 欧美一区二区三区四区高清| 成人福利视频网站| 久久精品国产99国产| 一区二区三区久久| 欧美国产乱子伦 | 亚洲精品国产精华液| 国产日韩精品一区二区三区在线| 精品视频一区二区不卡| k8久久久一区二区三区| 黄网站免费久久| 日韩在线卡一卡二| 一区二区三区四区不卡在线| 欧美国产一区二区| 久久综合色婷婷| 欧美一区三区四区| 欧美色综合天天久久综合精品| 国产精品一卡二卡| 美腿丝袜亚洲三区| 五月激情综合网| 亚洲人成精品久久久久| 国产精品乱人伦| 国产精品天天摸av网| 久久天天做天天爱综合色| 国产亚洲精品aa午夜观看| 日韩一区二区三区观看| 欧美另类高清zo欧美| 欧美最猛性xxxxx直播| 色综合久久久久久久久久久| 成人av午夜影院| 97精品久久久午夜一区二区三区 | 91免费国产在线观看| 国产99精品国产| 成人97人人超碰人人99| 成人天堂资源www在线| 波多野结衣中文字幕一区 | 国产一区欧美二区| 精品福利一二区| 在线视频综合导航| 91香蕉国产在线观看软件| 94-欧美-setu| 日本久久一区二区三区| 亚洲国产高清在线| 久久男人中文字幕资源站| 久久亚洲二区三区| 色综合久久综合网97色综合| 91精品国产综合久久精品 | 51精品视频一区二区三区| 国产精品看片你懂得| 久久国产日韩欧美精品| 在线观看一区不卡| 中文字幕精品在线不卡| 男女男精品网站| 日本久久精品电影| 国产精品久久久久久久久动漫| 免费观看日韩电影| 欧美视频三区在线播放| 国产精品私房写真福利视频| 国产一区二区毛片| 日韩一区二区三区高清免费看看| 亚洲精品老司机| 丁香婷婷综合网| 久久久精品国产免大香伊| 美女在线视频一区| 91麻豆精品国产自产在线观看一区| 136国产福利精品导航| 国产真实乱对白精彩久久| 日韩欧美在线不卡| 日韩av在线播放中文字幕| 欧美色手机在线观看| 亚洲精品视频在线观看免费| 成人黄色a**站在线观看| 国产精品乱码一区二区三区软件| 国内精品伊人久久久久av影院| 日韩欧美国产综合一区| 轻轻草成人在线| 在线不卡欧美精品一区二区三区| 亚洲成人激情社区| 欧美精品久久99久久在免费线| 亚洲网友自拍偷拍| 555夜色666亚洲国产免| 日本中文字幕不卡| 欧美电影免费观看完整版| 国产在线精品一区二区三区不卡| 精品国产成人系列|