• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            內(nèi)核式線程同步之waitable timer

            轉(zhuǎn)載自:http://zouxiaochuan.bokee.com/3227203.html

            waitable timer
                  
            顧名思義,就是隔一段時間被signaled的一種內(nèi)核對象。waitable timer跟event對象一樣可以在創(chuàng)建的時候指定reset方式,如果是manual-reset,那么當(dāng)waitable timer對象被signaled時,所有等待這個對象的wait函數(shù)都會返回。如果是auto-reset那么就只有一個wait函數(shù)會返回。

            創(chuàng)建完waitable timer對象后,必須通過SetWaitableTimer函數(shù)對它進(jìn)行時間上的設(shè)置。時間格式是個問題,看下面代碼

            // Declare our local variables.
            HANDLE hTimer;
            SYSTEMTIME st;
            FILETIME ftLocal, ftUTC;
            LARGE_INTEGER liUTC;

            // Create an auto-reset timer.
            hTimer = CreateWaitableTimer(NULL, FALSE, NULL);

            // First signaling is at January 1, 2002, at 1:00 P.M. (local time).
            st.wYear         = 2002// Year
            st.wMonth        = 1;    // January
            st.wDayOfWeek    = 0;    // Ignored
            st.wDay          = 1;    // The first of the month
            st.wHour         = 13;   // 1PM
            st.wMinute       = 0;    // 0 minutes into the hour
            st.wSecond       = 0;    // 0 seconds into the minute
            st.wMilliseconds = 0;    // 0 milliseconds into the second

            SystemTimeToFileTime(
            &st, &ftLocal);

            // Convert local time to UTC time.
            LocalFileTimeToFileTime(&ftLocal, &ftUTC);
            // Convert FILETIME to LARGE_INTEGER because of different alignment.
            liUTC.LowPart  = ftUTC.dwLowDateTime;
            liUTC.HighPart 
            = ftUTC.dwHighDateTime;

            // Set the timer.
            SetWaitableTimer(hTimer, &liUTC, 6 * 60 * 60 * 1000, NULL, NULL, FALSE);

             

            上面的代碼查下MSDN應(yīng)該很容易理解,這里要說的是CPU對齊的問題。FILETIME結(jié)構(gòu)必須位于32位邊界,而LARGE_INTEGER必須位于64位邊界,所以不能將FILETIME直接傳給SetWaitableTimer。

            SetWaitableTimer也可以使用時間的絕對值,或者使用相對時間值。不過這時的值必須是負(fù)的。看下面代碼:

            // Declare our local variables.
            HANDLE hTimer;
            LARGE_INTEGER li;

            // Create an auto-reset timer.
            hTimer = CreateWaitableTimer(NULL, FALSE, NULL);

            // Set the timer to go off 5 seconds after calling SetWaitableTimer.
            // Timer unit is 100-nanoseconds.
            const int nTimerUnitsPerSecond = 10000000;

            // Negate the time so that SetWaitableTimer knows we 
            // want relative time instead of absolute time.
            // This indicate that the timer will be signaled 5 seconds after the call to SetWaitableTimer
            li.QuadPart = -(5 * nTimerUnitsPerSecond); 
             
            // Set the timer.
            SetWaitableTimer(hTimer, &li, 6 * 60 * 60 * 1000, NULL, NULL, FALSE);

            清除waitable timer對象需要用到CancelWaitableTimer函數(shù)。

            特別提出的是waitable timer這節(jié)引出了一個新概念:APC(asynchronous procedure call)。按照我的理解,APC應(yīng)該是線程特有的一個隊列,里面裝的是函數(shù)地址。如果一個函數(shù)地址被裝入APC,如果這時線程處于待命的等待狀態(tài)(alertable wait),那么這個線程就會被喚醒去調(diào)用APC里的函數(shù);否則,APC里的函數(shù)地址就會被忽略掉。這里的這個線程指的是調(diào)用SetWaitableTimer的線程。下面的代碼能說明問題

            VOID APIENTRY TimerAPCRoutine(PVOID pvArgToCompletionRoutine,
               DWORD dwTimerLowValue, DWORD dwTimerHighValue) 
            {

               FILETIME ftUTC, ftLocal;
               SYSTEMTIME st;
               TCHAR szBuf[
            256];

               
            // Put the time in a FILETIME structure.
               ftUTC.dwLowDateTime = dwTimerLowValue;
               ftUTC.dwHighDateTime 
            = dwTimerHighValue;

               
            // Convert the UTC time to the user's local time.
               FileTimeToLocalFileTime(&ftUTC, &ftLocal);

               
            // Convert the FILETIME to the SYSTEMTIME structure
               
            // required by GetDateFormat and GetTimeFormat.
               FileTimeToSystemTime(&ftLocal, &st);

               
            // Construct a string with the 
               
            // date/time that the timer went off.
               GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, 
                  
            &st, NULL, szBuf, sizeof(szBuf) / sizeof(TCHAR));
               _tcscat(szBuf, _ _TEXT(
            " "));
               GetTimeFormat(LOCALE_USER_DEFAULT, 
            0,
                  
            &st, NULL, _tcschr(szBuf, 0), 
                  
            sizeof(szBuf) / sizeof(TCHAR) - _tcslen(szBuf));

               
            // Show the time to the user.
               MessageBox(NULL, szBuf, "Timer went off at", MB_OK);
            }


            void SomeFunc() {
               
            // Create a timer. (It doesn't matter whether it's manual-reset 
               
            // or auto-reset.)
               HANDLE hTimer = CreateWaitableTimer(NULL, TRUE, NULL);

               
            // Set timer to go off in 5 seconds.
               LARGE_INTEGER li = 0 };
               SetWaitableTimer(hTimer, 
            &li, 5000, TimerAPCRoutine, NULL, FALSE);

               
            // Wait in an alertable state for the timer to go off.
               SleepEx(INFINITE, TRUE);

               CloseHandle(hTimer);
            }

            如果指定了APC,那么就不要等待這個waitable timer對象了,因為APC隊列會喚醒線程的,不需要wait函數(shù)。

            posted on 2011-06-02 17:25 楊粼波 閱讀(1131) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久露脸国产精品| 性色欲网站人妻丰满中文久久不卡| 久久婷婷五月综合97色| 丁香五月网久久综合| 精品久久久久久无码中文字幕| 久久久久久久久久久免费精品 | 久久久久亚洲av无码专区 | 99精品国产免费久久久久久下载| 国产色综合久久无码有码| 久久超乳爆乳中文字幕| 欧美色综合久久久久久| 99久久久国产精品免费无卡顿| 久久久久久亚洲精品无码| 无遮挡粉嫩小泬久久久久久久 | 久久久久99精品成人片直播| 99久久国产综合精品五月天喷水| 伊人伊成久久人综合网777| 久久综合久久久| 午夜天堂精品久久久久| 伊人久久精品影院| 久久久久无码中| 91精品国产高清久久久久久国产嫩草| 国产成人久久精品一区二区三区| 久久93精品国产91久久综合 | 人妻系列无码专区久久五月天| 亚洲av日韩精品久久久久久a| 久久综合色之久久综合| 亚洲综合精品香蕉久久网97| 久久久久亚洲av无码专区| 色综合久久无码五十路人妻| 国产亚洲精久久久久久无码77777| 色悠久久久久久久综合网| 久久无码人妻精品一区二区三区 | 久久精品国产亚洲av瑜伽| 精品久久777| 免费国产99久久久香蕉| www.久久精品| 久久噜噜电影你懂的| 91精品国产91久久| 久久久精品人妻无码专区不卡| 久久婷婷人人澡人人|