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

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

?? schedule.cpp

?? 用DirectX制作高級動畫-[Advanced.Animation.with.DirectX]
?? CPP
字號:
//------------------------------------------------------------------------------
// File: Schedule.cpp
//
// Desc: DirectShow base classes.
//
// Copyright (c) 1996-2002 Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------------------------


#include <streams.h>

// DbgLog values (all on LOG_TIMING):
//
// 2 for schedulting, firing and shunting of events
// 3 for wait delays and wake-up times of event thread
// 4 for details of whats on the list when the thread awakes

/* Construct & destructors */

CAMSchedule::CAMSchedule( HANDLE ev )
: CBaseObject(TEXT("CAMSchedule"))
, head(&z, 0), z(0, MAX_TIME)
, m_dwNextCookie(0), m_dwAdviseCount(0)
, m_pAdviseCache(0), m_dwCacheCount(0)
, m_ev( ev )
{
    head.m_dwAdviseCookie = z.m_dwAdviseCookie = 0;
}

CAMSchedule::~CAMSchedule()
{
    m_Serialize.Lock();

    // Delete cache
    CAdvisePacket * p = m_pAdviseCache;
    while (p)
    {
        CAdvisePacket *const p_next = p->m_next;
        delete p;
        p = p_next;
    }

    ASSERT( m_dwAdviseCount == 0 );
    // Better to be safe than sorry
    if ( m_dwAdviseCount > 0 )
    {
        DumpLinkedList();
        while ( !head.m_next->IsZ() )
        {
            head.DeleteNext();
            --m_dwAdviseCount;
        }
    }

    // If, in the debug version, we assert twice, it means, not only
    // did we have left over advises, but we have also let m_dwAdviseCount
    // get out of sync. with the number of advises actually on the list.
    ASSERT( m_dwAdviseCount == 0 );

    m_Serialize.Unlock();
}

/* Public methods */

DWORD CAMSchedule::GetAdviseCount()
{
    // No need to lock, m_dwAdviseCount is 32bits & declared volatile
    return m_dwAdviseCount;
}

REFERENCE_TIME CAMSchedule::GetNextAdviseTime()
{
    CAutoLock lck(&m_Serialize); // Need to stop the linked list from changing
    return head.m_next->m_rtEventTime;
}

DWORD_PTR CAMSchedule::AddAdvisePacket
( const REFERENCE_TIME & time1
, const REFERENCE_TIME & time2
, HANDLE h, BOOL periodic
)
{
    // Since we use MAX_TIME as a sentry, we can't afford to
    // schedule a notification at MAX_TIME
    ASSERT( time1 < MAX_TIME );
    DWORD_PTR Result;
    CAdvisePacket * p;

    m_Serialize.Lock();

    if (m_pAdviseCache)
    {
        p = m_pAdviseCache;
        m_pAdviseCache = p->m_next;
        --m_dwCacheCount;
    }
    else
    {
        p = new CAdvisePacket();
    }
    if (p)
    {
        p->m_rtEventTime = time1; p->m_rtPeriod = time2;
        p->m_hNotify = h; p->m_bPeriodic = periodic;
        Result = AddAdvisePacket( p );
    }
    else Result = 0;

    m_Serialize.Unlock();

    return Result;
}

HRESULT CAMSchedule::Unadvise(DWORD_PTR dwAdviseCookie)
{
    HRESULT hr = S_FALSE;
    CAdvisePacket * p_prev = &head;
    CAdvisePacket * p_n;
    m_Serialize.Lock();
    while ( p_n = p_prev->Next() ) // The Next() method returns NULL when it hits z
    {
        if ( p_n->m_dwAdviseCookie == dwAdviseCookie )
        {
            Delete( p_prev->RemoveNext() );
            --m_dwAdviseCount;
            hr = S_OK;
	    // Having found one cookie that matches, there should be no more
            #ifdef DEBUG
	       while (p_n = p_prev->Next())
               {
                   ASSERT(p_n->m_dwAdviseCookie != dwAdviseCookie);
                   p_prev = p_n;
               }
            #endif
            break;
        }
        p_prev = p_n;
    };
    m_Serialize.Unlock();
    return hr;
}

REFERENCE_TIME CAMSchedule::Advise( const REFERENCE_TIME & rtTime )
{
    REFERENCE_TIME  rtNextTime;
    CAdvisePacket * pAdvise;

    DbgLog((LOG_TIMING, 2,
        TEXT("CAMSchedule::Advise( %lu ms )"), ULONG(rtTime / (UNITS / MILLISECONDS))));

    CAutoLock lck(&m_Serialize);

    #ifdef DEBUG
        if (DbgCheckModuleLevel(LOG_TIMING, 4)) DumpLinkedList();
    #endif

    //  Note - DON'T cache the difference, it might overflow 
    while ( rtTime >= (rtNextTime = (pAdvise=head.m_next)->m_rtEventTime) &&
            !pAdvise->IsZ() )
    {
        ASSERT(pAdvise->m_dwAdviseCookie); // If this is zero, its the head or the tail!!

        ASSERT(pAdvise->m_hNotify != INVALID_HANDLE_VALUE);

        if (pAdvise->m_bPeriodic == TRUE)
        {
            ReleaseSemaphore(pAdvise->m_hNotify,1,NULL);
            pAdvise->m_rtEventTime += pAdvise->m_rtPeriod;
            ShuntHead();
        }
        else
        {
            ASSERT( pAdvise->m_bPeriodic == FALSE );
            EXECUTE_ASSERT(SetEvent(pAdvise->m_hNotify));
            --m_dwAdviseCount;
            Delete( head.RemoveNext() );
        }

    }

    DbgLog((LOG_TIMING, 3,
            TEXT("CAMSchedule::Advise() Next time stamp: %lu ms, for advise %lu."),
            DWORD(rtNextTime / (UNITS / MILLISECONDS)), pAdvise->m_dwAdviseCookie ));

    return rtNextTime;
}

/* Private methods */

DWORD_PTR CAMSchedule::AddAdvisePacket( CAdvisePacket * pPacket )
{
    ASSERT(pPacket->m_rtEventTime >= 0 && pPacket->m_rtEventTime < MAX_TIME);
    ASSERT(CritCheckIn(&m_Serialize));

    CAdvisePacket * p_prev = &head;
    CAdvisePacket * p_n;

    const DWORD_PTR Result = pPacket->m_dwAdviseCookie = ++m_dwNextCookie;
    // This relies on the fact that z is a sentry with a maximal m_rtEventTime
    for(;;p_prev = p_n)
    {
        p_n = p_prev->m_next;
        if ( p_n->m_rtEventTime >= pPacket->m_rtEventTime ) break;
    }
    p_prev->InsertAfter( pPacket );
    ++m_dwAdviseCount;

    DbgLog((LOG_TIMING, 2, TEXT("Added advise %lu, for thread 0x%02X, scheduled at %lu"),
    	pPacket->m_dwAdviseCookie, GetCurrentThreadId(), (pPacket->m_rtEventTime / (UNITS / MILLISECONDS)) ));

    // If packet added at the head, then clock needs to re-evaluate wait time.
    if ( p_prev == &head ) SetEvent( m_ev );

    return Result;
}

void CAMSchedule::Delete( CAdvisePacket * pPacket )
{
    if ( m_dwCacheCount >= dwCacheMax ) delete pPacket;
    else
    {
        m_Serialize.Lock();
        pPacket->m_next = m_pAdviseCache;
        m_pAdviseCache = pPacket;
        ++m_dwCacheCount;
        m_Serialize.Unlock();
    }
}


// Takes the head of the list & repositions it
void CAMSchedule::ShuntHead()
{
    CAdvisePacket * p_prev = &head;
    CAdvisePacket * p_n;

    m_Serialize.Lock();
    CAdvisePacket *const pPacket = head.m_next;

    // This will catch both an empty list,
    // and if somehow a MAX_TIME time gets into the list
    // (which would also break this method).
    ASSERT( pPacket->m_rtEventTime < MAX_TIME );

    // This relies on the fact that z is a sentry with a maximal m_rtEventTime
    for(;;p_prev = p_n)
    {
        p_n = p_prev->m_next;
        if ( p_n->m_rtEventTime > pPacket->m_rtEventTime ) break;
    }
    // If p_prev == pPacket then we're already in the right place
    if (p_prev != pPacket)
    {
        head.m_next = pPacket->m_next;
        (p_prev->m_next = pPacket)->m_next = p_n;
    }
    #ifdef DEBUG
        DbgLog((LOG_TIMING, 2, TEXT("Periodic advise %lu, shunted to %lu"),
    	    pPacket->m_dwAdviseCookie, (pPacket->m_rtEventTime / (UNITS / MILLISECONDS)) ));
    #endif
    m_Serialize.Unlock();
}


#ifdef DEBUG
void CAMSchedule::DumpLinkedList()
{
    m_Serialize.Lock();
    int i=0;
    DbgLog((LOG_TIMING, 1, TEXT("CAMSchedule::DumpLinkedList() this = 0x%p"), this));
    for ( CAdvisePacket * p = &head
        ; p
        ; p = p->m_next         , i++
        )	
    {
        DbgLog((LOG_TIMING, 1, TEXT("Advise List # %lu, Cookie %d,  RefTime %lu"),
            i,
	    p->m_dwAdviseCookie,
	    p->m_rtEventTime / (UNITS / MILLISECONDS)
            ));
    }
    m_Serialize.Unlock();
}
#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产麻豆91精品| 久久精品99国产精品| 日韩精品中午字幕| 91免费看片在线观看| 美女www一区二区| 日韩伦理免费电影| 久久综合久久综合九色| 欧美日韩中文字幕精品| 懂色av中文一区二区三区| 日本亚洲最大的色成网站www| 亚洲色图欧美激情| 中文无字幕一区二区三区| 日韩欧美一区二区视频| 在线精品视频免费观看| 成人av影视在线观看| 激情六月婷婷久久| 人人狠狠综合久久亚洲| 亚洲影院理伦片| 亚洲女爱视频在线| 国产精品电影一区二区| 精品国产乱码久久| 91精品在线观看入口| 精品视频999| 欧美性受xxxx黑人xyx性爽| 91丨九色丨国产丨porny| 国产传媒久久文化传媒| 激情欧美一区二区三区在线观看| 日韩不卡一区二区| 日韩在线a电影| 午夜电影一区二区三区| 亚洲综合一区二区精品导航| 亚洲视频在线一区观看| 亚洲视频在线一区二区| 亚洲欧美日韩电影| 亚洲码国产岛国毛片在线| 亚洲欧洲日韩在线| 亚洲男人天堂一区| 亚洲欧美日韩国产另类专区 | 亚洲另类在线一区| 亚洲人成7777| 亚洲自拍欧美精品| 亚洲午夜激情网站| 日韩在线a电影| 美腿丝袜亚洲色图| 韩国成人在线视频| 丰满亚洲少妇av| av在线播放成人| 99久久精品免费观看| 色婷婷国产精品综合在线观看| 色综合激情久久| 欧美在线999| 欧美另类高清zo欧美| 日韩一区二区视频| 久久久777精品电影网影网| 国产三区在线成人av| 亚洲视频一区二区免费在线观看| 亚洲欧美日韩在线| 天天综合色天天| 狠狠色丁香婷婷综合久久片| 国产精品 日产精品 欧美精品| 成人午夜电影网站| 色乱码一区二区三区88| 欧美丰满嫩嫩电影| 久久美女艺术照精彩视频福利播放 | 欧美在线一区二区三区| 欧美精品色综合| 精品剧情在线观看| 欧美激情一区二区在线| 亚洲女同一区二区| 日本麻豆一区二区三区视频| 国产综合色在线视频区| 国产.欧美.日韩| 色视频一区二区| 日韩一级在线观看| 国产欧美精品一区二区三区四区| 亚洲欧洲99久久| 亚洲成人av一区| 国产精品综合二区| 欧美综合视频在线观看| 欧美电影免费观看高清完整版在线观看 | 国内外成人在线| 91麻豆高清视频| 精品黑人一区二区三区久久| 成人欧美一区二区三区1314| 日本免费新一区视频 | 欧美大肚乱孕交hd孕妇| 亚洲天堂精品在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 国产成人鲁色资源国产91色综| 91国在线观看| 国产人成一区二区三区影院| 午夜日韩在线观看| 成人午夜激情视频| 日韩三级.com| 亚洲精品乱码久久久久| 国产一区二区三区国产| 欧美日韩一区二区三区不卡| 欧美激情中文不卡| 久久精品国产99国产| 91传媒视频在线播放| 国产色婷婷亚洲99精品小说| 视频一区二区三区在线| 99riav久久精品riav| 精品毛片乱码1区2区3区 | 国产乱人伦偷精品视频不卡| 欧美亚洲自拍偷拍| 国产精品色一区二区三区| 蜜桃精品视频在线| 精品视频一区二区三区免费| 1000精品久久久久久久久| 国产专区欧美精品| 欧美一区二区在线观看| 亚洲图片欧美色图| 91首页免费视频| 国产欧美精品在线观看| 久久99国产精品久久99| 欧美精品久久久久久久久老牛影院| 国产精品麻豆视频| 国产成人免费在线观看不卡| 欧美大肚乱孕交hd孕妇| 奇米影视在线99精品| 欧美日韩一区二区三区四区| 一区二区国产视频| 色婷婷久久久久swag精品| 亚洲欧洲av色图| 99久久婷婷国产综合精品电影| 久久先锋资源网| 狠狠色综合日日| 久久男人中文字幕资源站| 韩国成人精品a∨在线观看| 精品成a人在线观看| 久久99精品国产.久久久久| 日韩精品一区二区三区在线| 日韩激情中文字幕| 日韩午夜电影av| 美女视频免费一区| 日韩女优制服丝袜电影| 久久精品国产免费看久久精品| 日韩亚洲欧美综合| 激情文学综合网| 国产清纯在线一区二区www| 福利一区二区在线| 中文字幕在线观看不卡视频| 96av麻豆蜜桃一区二区| 亚洲精品你懂的| 欧美性猛交xxxxxx富婆| 午夜久久久久久久久久一区二区| 欧美日韩午夜精品| 日韩av成人高清| 精品福利av导航| 国产乱码字幕精品高清av| 国产精品久久久久久久久快鸭 | 91天堂素人约啪| 亚洲国产成人精品视频| 制服丝袜在线91| 激情欧美一区二区| 亚洲国产精品成人综合色在线婷婷| 国产69精品一区二区亚洲孕妇| 国产精品毛片无遮挡高清| 一本色道久久综合亚洲91| 亚洲超碰97人人做人人爱| 日韩西西人体444www| 国产精品亚洲第一| 亚洲色图都市小说| 制服.丝袜.亚洲.中文.综合| 国产在线播放一区| 亚洲欧美在线另类| 3d成人动漫网站| 国产高清无密码一区二区三区| 中文字幕一区二| 欧美久久久久久久久久| 国产一区二区在线影院| 亚洲人成网站影音先锋播放| 欧美绝品在线观看成人午夜影视| 精品午夜久久福利影院| 亚洲色图制服诱惑| 日韩免费电影网站| 成人h精品动漫一区二区三区| 一区二区三区久久| 精品国产凹凸成av人网站| 成人av在线一区二区三区| 日欧美一区二区| 国产精品午夜春色av| 这里是久久伊人| av在线不卡电影| 老鸭窝一区二区久久精品| 成人免费在线播放视频| 91精品一区二区三区在线观看| 成人网男人的天堂| 日本va欧美va瓶| 亚洲欧洲日产国码二区| 日韩视频123| 日本伦理一区二区| 国产一区二区三区蝌蚪| 国产成人高清视频| 亚洲电影一级黄| 国产精品激情偷乱一区二区∴| 日韩欧美在线观看一区二区三区| 色婷婷久久综合| 国产凹凸在线观看一区二区 |