边际效用递减例子:CTPResUpdateView

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 11:44:13
class CTPBaseThread;
typedef UINT (*AFX_THREADPROCEX)(LPVOID,BOOL *,CTPBaseThread *);
class AFX_EXT_CLASS CTPBaseThread
{
public:
 CTPBaseThread()
 { 
  for(INT l=0;l<4;l++)
   m_hDefaultEvent[l] = NULL;  m_hThreadEvent     = ::CreateEvent(0,FALSE,FALSE,0);
  m_bThreadRun       = FALSE;
  m_pThreadFun       = NULL;
  m_pThreadParam     = NULL;
  m_pThreadHandle    = NULL;
  m_pCriticalSection = NULL;
  m_bThreadFlag      = FALSE;
 }
 ~CTPBaseThread()
 {
  if(m_hThreadEvent)  ::CloseHandle(m_hThreadEvent);
  m_hThreadEvent  = NULL;  for(INT l=0;l<4;l++)
  {
   if(m_hDefaultEvent[l])
    ::CloseHandle(m_hDefaultEvent[l]);
   m_hDefaultEvent[l] = NULL;
  }  m_bThreadRun    = FALSE;
  m_pThreadFun    = NULL;
  m_pThreadParam  = NULL;
  m_pThreadHandle = NULL;  if(m_pCriticalSection)
  {
   DeleteCriticalSection(m_pCriticalSection);
   delete m_pCriticalSection;
   m_pCriticalSection = NULL;
  }
 }
 BOOL BeginThread(AFX_THREADPROCEX pfnThreadProc, LPVOID pParam,int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0,DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL)
 {
  if(pfnThreadProc)
  {
   m_pThreadFun   = pfnThreadProc;
   m_pThreadParam = pParam;
  }  ASSERT(m_bThreadRun == FALSE);  ::ResetEvent(m_hThreadEvent);
  m_bThreadRun   = TRUE;  m_pThreadHandle = AfxBeginThread(ThreadProc,this,nPriority,nStackSize,dwCreateFlags,lpSecurityAttrs);
  if(m_pThreadHandle) ::WaitForSingleObject(m_hThreadEvent,10000);
  ::ResetEvent(m_hThreadEvent);
  return m_pThreadHandle != NULL;
 }
 static UINT ThreadProc(LPVOID pVoid)
 {
  CTPBaseThread *pThread = (CTPBaseThread *)pVoid;
  ::SetEvent(pThread->m_hThreadEvent);  UINT uReturn =  0;
  if(pThread ->m_pThreadFun)
   uReturn = pThread ->m_pThreadFun(pThread ->m_pThreadParam ,&pThread->m_bThreadRun,pThread);  pThread ->m_bThreadRun = FALSE;
  ::SetEvent(pThread->m_hThreadEvent);  return uReturn;
 }
 void CreateEvent(int iIndex)
 {
  if(m_hDefaultEvent[iIndex] == NULL)
   m_hDefaultEvent[iIndex] = ::CreateEvent(0,FALSE,FALSE,0);
 }
 void CreateCritical()
 {
  if(m_pCriticalSection == NULL)
  {
   m_pCriticalSection = new CRITICAL_SECTION;
   InitializeCriticalSection(m_pCriticalSection);
  }
 }
 void Lock()
 {
  if(m_pCriticalSection)
   EnterCriticalSection(m_pCriticalSection);
 }
 void Unlock()
 {
  if(m_pCriticalSection)
   LeaveCriticalSection(m_pCriticalSection);
 }
 void WaitThread(HANDLE hStopEvent = NULL)
 {
  if(m_bThreadRun)
  {   
   if(hStopEvent) ::SetEvent(hStopEvent);
   ::WaitForSingleObject(m_hThreadEvent,1000000);
  }
  m_pThreadHandle = NULL;
 }
 void EndThread(HANDLE hStopEvent = NULL)
 {
  if(m_bThreadRun)
  {
   m_bThreadRun = FALSE;
   if(hStopEvent) ::SetEvent(hStopEvent);
   ::WaitForSingleObject(m_hThreadEvent,1000000);
  }
   m_pThreadHandle = NULL;
 }
public:
 HANDLE             m_hDefaultEvent[4]; HANDLE             m_hThreadEvent;
 BOOL               m_bThreadRun;
 AFX_THREADPROCEX   m_pThreadFun;
 LPVOID             m_pThreadParam;
 CWinThread        *m_pThreadHandle;
 CRITICAL_SECTION  *m_pCriticalSection;
 BOOL               m_bThreadFlag;
};
    typedef struct tag_TPCacheRegister{         DWORD    dwID;//窗口ID         void    (*funUpData)(DWORD ,GUID,TP_RES_TYPE ,TP_NODE_TYPE,LPARAM ); //更新通知函数         tag_TPCacheRegister(DWORD dwSetID,void (*funSetUpdate)(DWORD,GUID,TP_RES_TYPE ,TP_NODE_TYPE,LPARAM))
        {
              dwID        = dwSetID;
              funUpdate   = funSetUpdate;
        }}TPCacheRegister;
typedef  CArray TPCacheRegisterArray;   //一个窗口一个更新函数//需要跟新的窗口传窗口ID和自定义的更新函数/*g_pClipManageInterface ->stuTreeInterface.TP_RegisterUserResData(m_hCacheData,(DWORD)(DWORD_PTR)this,DataChangeCallBack); void      TP_RegisterUserResData(HRESDATA hUserResData,DWORD dwID,void (*funUpdate)(DWORD ,GUID,TP_RES_TYPE ,TP_NODE_TYPE,LPARAM)){            if(hUserResData == NULL)//没有Cache 的话,放到公共的g_aDissociateRegister中            {                     for(int l = 0 ; l                          if(pResCache->m_aRegisterID[l].dwID == dwID) return;
                    pResCache->m_aRegisterID.Add(TPCacheRegister(dwID,funUpdate));            }}*/  typedef struct tag_TPCacheUpdateData // 更新时需要传递的参数{               GUID             guidDBType;    //Team 句柄               TP_RES_TYPE   eResType;//eResType判断是否是材,TL,模板,Catalog               TP_NODE_TYPE eNodeType;//判断所在Catalog是工程,自定义Catalog,还是系统Catalog               GUID             guidRes;//素材,TL,模板,Catalog的句柄               GUID             guidNode;;//素材,TL,模板,Catalog所在Catalog的句柄               BOOL            bToNet;   //此命令是否发送到网络 
               BOOL            bFromNet;//此命令是否从网络中接受               tag_TPCacheUpdateData() 
             {
                             guidDBType    = GUID_NULL;
                             eResType      = TP_RES_UNKNOW;
                             eNodeType     = TP_NODE_UNKNOW;
                             guidRes       = GUID_NULL;
                             guidNode      = GUID_NULL;
                             bToNet        = FALSE;
                             bFromNet      = FALSE;
             }}TPCacheUpdateData;
typedef  CArray TPCacheUpdateDataArray;  extern TPCacheRegisterArray    g_aDissociateRegister; class CTPResUpdateView  {public:        CTPResUpdateView();        ~CTPResUpdateView();public:
       TPCacheRegisterArray    m_aRegisterID;      //与之想关联的窗口注册信息       TPCacheUpdateDataArray  m_aUpdateViewData;  //更新内容       CTPBaseThread           m_stuUpdateThread;      BOOL                    m_bUpdateThread;            CTPBaseThread           m_stuRefreshThread;
      BOOL                    m_bRefreshThread;
      TPRefreshResArray       m_aRefreshData;       CTPBaseThread           m_stuNetRefreshThread;
      BOOL                    m_bNetRefreshThread;
      TPSockCommandPtrArray   m_aNetRefreshData;        CTPResCache            *m_pResCache;        CTPBaseThread           m_stuGetResThread;
      TPResDataArray          m_aGetResData; public: LRESULT                RefreshClip(TPRefreshRes &stuData);
 void                   UpdateView(GUID guidDBType,TP_RES_TYPE eResUpdataType,TP_NODE_TYPE dwType,GUID guidNode,GUID guidRes,BOOL bToNet = TRUE );
 void                   UpdateNet(TPSockCommand *pCmd);
 void                   RegisterID(DWORD dwID,void (*funUpdate)(DWORD ,GUID,TP_RES_TYPE ,TP_NODE_TYPE,LPARAM));
 BOOL                   UnregisterID(DWORD dwID); void                   SetLockUpdateView(BOOL bUpdateView);
 void                   SetLockUpdateNet(BOOL bUpdateView);
 void                   SetLockRefreshClip(BOOL bLock); void                   TransMsg();
 LRESULT                DeleteGuiRes(GUID guidDBType,GUID guidCatalog,HRESDATA hResData,TP_RES_TYPE eResType,GUID guidRes,TPResDelParam *pDeleteData); LRESULT                DeleteResNotify(GUID guidDBType,GUID guidCatalog,HRESDATA hResData,TP_RES_TYPE eResType,GUID guidRes,long lLock,TPResDelParam *pDelParam,BOOL bNetSend = TRUE);
 LRESULT                BaseResRename(GUID guidDBType,GUID guidCatalog,GUID guidRes,TP_RES_TYPE dwResTYpe,LPCTSTR sName,BOOL bNetSend = TRUE);
 void                   GetResThread(TPResDataArray &aResData);
 virtual void           GetResData(TPResData &stuData){}
public:
 virtual void           ClearDeleteObject();
}; extern TPCacheRegisterArray    g_aDissociateRegister;
UINT           TP_UpdateViewThread( LPVOID pParam ,BOOL *pbRun,CTPBaseThread *pThread);
UINT           TP_RefreshClipThread(LPVOID pVoid,BOOL *pbRun,CTPBaseThread *pThread);
UINT           TP_UpdateNetThread( LPVOID pParam ,BOOL *pbRun,CTPBaseThread *pThread);#define  WM_UPDATEVIEWMESSAGE     WM_MESSAGEEXCHANGE9
#define  WM_UPDATEVIEWNETMESSAGE  WM_MESSAGEEXCHANGE8
#define  WM_REFRESHCLIPMESSAGE    WM_MESSAGEEXCHANGE7
#define  WM_RESOPERATEMESSAGE     WM_MESSAGEEXCHANGE6LRESULT   TP_UpdateViewMessage(WPARAM wp,LPARAM lp,LPVOID pUser)
{
          CTPResUpdateView *pUpdateView = (CTPResUpdateView *)pUser;
          TPRefreshRes     *pRfresh     = (TPRefreshRes*)wp;
          for(int m =0;mm_aRegisterID.GetSize();m++)
          {
                 if(pUpdateView ->m_aRegisterID[m].funUpdate)
                        pUpdateView ->m_aRegisterID[m].funUpdate(pUpdateView ->m_aRegisterID[m].dwID,pRfresh->guidDBType, pRfresh-> eResType,pRfresh->eNodeType, (LPARAM)&pRfresh->aGuidList);
         }  
         for(int m =0;m        {
              if(g_aDissociateRegister[m].funUpdate)
                     g_aDissociateRegister[m].funUpdate(g_aDissociateRegister[m].dwID,pRfresh->guidDBType, pRfresh-> eResType,pRfresh->eNodeType, (LPARAM)&pRfresh->aGuidList);
       }  
       if(g_pCenterCallBack && g_pCenterCallBack ->TP_RefreshCatalog && (pRfresh->eResType & TP_RES_CATALOGCHILD) && (pRfresh->eNodeType & TP_NODE_CGPREFABRICATE))
       {
              for(INT l=0;laGuidList.GetSize();l++) g_pCenterCallBack ->TP_RefreshCatalog(pRfresh->guidDBType, pRfresh->aGuidList[l]);
       }       ASSERT(pRfresh->aGuidList.GetSize()!=0);
       pRfresh->aGuidList.RemoveAll();      ::SetEvent((HANDLE)lp);       return S_OK;
} //接受网络消息,处理本机
LRESULT   TP_UpdateViewNetMessage(WPARAM wp,LPARAM lp,LPVOID pUser)
{
       CTPResUpdateView *pUpdateView  = (CTPResUpdateView *)pUser;
       TPSockCommand     *pRfresh     = (TPSockCommand*)wp;
       pUpdateView ->m_pResCache ->SocketCmdCallBack(pRfresh);
       ::SetEvent((HANDLE)lp);
       return S_OK;
} // 通过DataCenter来RefreshClip
LRESULT   TP_RefreshClipMessage(WPARAM wp,LPARAM lp,LPVOID pUser)
{
       CTPResUpdateView *pUpdateView = (CTPResUpdateView *)pUser;
       TPRefreshRes     *pRfresh     = (TPRefreshRes*)wp;       g_pCenterCallBack ->TP_RefreshClip(pRfresh);       ::SetEvent((HANDLE)lp);
       return S_OK;
}// 删除和改名
LRESULT   TP_ResOperateMessage(WPARAM wp,LPARAM lp,LPVOID pUser)
{
       if(wp ==1)
       {
           TPResData *pstuResData = (TPResData *)lp;
           TP_DeleteResEx(pstuResData->guidDBType,pstuResData-> guidNode,pstuResData-> hResData,pstuResData-> eResType,pstuResData-> guidRes,pstuResData-> lEffParam,(TPResDelParam *)pstuResData->lParam);
           delete pstuResData;
       }
       else if(wp ==2)
       {
              TPResData *pstuResData = (TPResData *)lp;
              if(g_pResCallBack && g_pResCallBack ->TP_DeleteRes)
                     g_pResCallBack ->TP_DeleteRes(pstuResData->guidDBType,pstuResData-> guidNode,pstuResData-> hResData,pstuResData-> eResType,pstuResData-> guidRes, (TPResDelParam *)pstuResData->lParam); 
              delete pstuResData;
       }
       else if(wp ==3)
       {
              TPResData *pstuResData = (TPResData *)lp;
              TCHAR     *pName       = (TCHAR *)pstuResData->lParam;              TP_BaseRes_RenameEx(pstuResData->guidDBType,pstuResData-> guidNode,pstuResData-> guidRes, pstuResData-> eResType,pName);
              delete [] pName;
              delete pstuResData;
       }       return S_OK;
}
CTPResUpdateView::CTPResUpdateView(void)
{
 m_bUpdateThread                       = TRUE;
 m_stuUpdateThread.m_pThreadParam      = this;
 m_stuUpdateThread.m_pThreadFun        = TP_UpdateViewThread;
 m_stuUpdateThread.CreateEvent(0);
 m_stuUpdateThread.CreateCritical(); CTPMessageCenter::m_funCallBack[8]    = TP_UpdateViewMessage;
 CTPMessageCenter::m_pCallBackParam[8] = this; m_bNetRefreshThread                       = TRUE;
 m_stuNetRefreshThread.m_pThreadParam      = this;
 m_stuNetRefreshThread.m_pThreadFun        = TP_UpdateNetThread;
 m_stuNetRefreshThread.CreateEvent(0);
  m_stuNetRefreshThread.CreateCritical();  CTPMessageCenter::m_funCallBack[7]       = TP_UpdateViewNetMessage;
 CTPMessageCenter::m_pCallBackParam[7]    = this;
 m_bRefreshThread                       = TRUE;
 m_stuRefreshThread.m_pThreadParam      = this;
 m_stuRefreshThread.m_pThreadFun        = TP_RefreshClipThread;
  m_stuRefreshThread.CreateCritical(); CTPMessageCenter::m_funCallBack[6]    = TP_RefreshClipMessage;
 CTPMessageCenter::m_pCallBackParam[6] = this; CTPMessageCenter::m_funCallBack[5]    = TP_ResOperateMessage;
 CTPMessageCenter::m_pCallBackParam[5] = this; m_pResCache                           = NULL;
 m_stuGetResThread.CreateCritical();
}
CTPResUpdateView::~CTPResUpdateView(void)
{
 m_stuUpdateThread.EndThread(m_stuUpdateThread.m_hDefaultEvent[0]); for(INT l=0;l  delete m_aUpdateViewData[l];
 m_aUpdateViewData.RemoveAll(); 
 m_stuNetRefreshThread.EndThread(m_stuNetRefreshThread.m_hDefaultEvent[0]);
 for(INT l=0;l  delete m_aNetRefreshData[l];
 m_aNetRefreshData.RemoveAll();   m_stuRefreshThread.EndThread(); for(INT l=0;l  delete m_aRefreshData[l];
 m_aRefreshData.RemoveAll();  TransMsg(); m_stuGetResThread.EndThread();
 m_aGetResData.RemoveAll(); CTPMessageCenter::m_funCallBack[8]    = NULL;
 CTPMessageCenter::m_funCallBack[7]    = NULL;
 CTPMessageCenter::m_funCallBack[6]    = NULL;
 CTPMessageCenter::m_funCallBack[5]    = NULL;
}   // 恢复回原来的数据
void  TP_BackUpdateViewData(TPCacheUpdateDataArray *paCache,TPCacheUpdateDataArray *paCurrent,CTPResUpdateView *pResCache)
{
       pResCache ->m_stuUpdateThread.Lock();
       for(INT l=0;lGetSize();l++)
              paCache->InsertAt(l,paCurrent->GetAt(l));
       paCurrent->RemoveAll();
       pResCache ->m_stuUpdateThread.Unlock();
}  //合并相同的TPCacheUpdateData
void TP_ComppseSameUpdateData(TPCacheUpdateDataArray &aCacheArray)
{
       for(INT l = 0;l<(INT)aCacheArray.GetSize();l++)
       {
                    for(int k = aCacheArray.GetSize()-1;k>l;k--)
                    {
                        if(aCacheArray[k]->Compare(aCacheArray[l]))
                        {
                               aCacheArray[l]->bToNet   |= aCacheArray[k]->bToNet;
                               aCacheArray[l]->bFromNet |= aCacheArray[k]->bFromNet;
                               delete aCacheArray[k];
                               aCacheArray.RemoveAt(k);
                        }
                    }
       }
}  ////对于TP_RES_CATALOGRES和TP_RES_CATALOGCHILD的,合并子的TPCacheUpdateDataArrayvoid TP_ComppseChildUpdateData(TPCacheUpdateDataArray &aCacheArray)
{
       for(INT l = 0;l<(INT)aCacheArray.GetSize();l++)
       {
           if(aCacheArray[l]->eResType & TP_RES_CATALOGRES)//对同目录的需要过滤掉本目录下的
           {
                        for(int k = aCacheArray.GetSize()-1;k>l;k--)
                        {     
                               if((aCacheArray[k] ->eResType & TP_RES_UPDATERES) && aCacheArray[l] ->IsChild( aCacheArray[k]))
                               {
                                               delete aCacheArray[k];
                                               aCacheArray.RemoveAt(k); 
                               } 
            }
       }
       if(aCacheArray[l]->eResType & TP_RES_CATALOGCHILD)//对同目录的需要过滤掉本目录下的
       {
                  for(int k = aCacheArray.GetSize()-1;k>l;k--)
                  {     
                            if((aCacheArray[k] ->eResType & TP_RES_CATALOGRES) && aCacheArray[l] ->Compare1( aCacheArray[k]))
                            {
                                            delete aCacheArray[k];
                                            aCacheArray.RemoveAt(k); 
                            } 
                  }
        }
    }
}  //激活线程
UINT TP_UpdateViewThread( LPVOID pParam ,BOOL *pbRun,CTPBaseThread *pThread)
{
       if(pParam == NULL)   return 1;
       CTPResUpdateView *pResCache = (CTPResUpdateView *)(CTPResUpdateView*)(DWORD_PTR)pParam;      if(*pbRun == FALSE)   return 1;           HANDLE        hEvent   = ::CreateEvent(0,NULL,NULL,0);
      TPRefreshRes  stuRfresh;
      while(*pbRun)
      {                 TPCacheUpdateDataArray   aCacheArray;
               CGuidArray               aGuidRes;
               CByteArray               aFromNet;
               GUID                     guidDBType;
               TP_RES_TYPE              eResType;
               TP_NODE_TYPE             eNodeType;
               BOOL                     bFromNet;
               BOOL                     bFind    = TRUE;
               pThread->Lock();
               aCacheArray.Copy(pResCache ->m_aUpdateViewData);
               pResCache ->m_aUpdateViewData.RemoveAll();               pThread->SetDataSize(0)
               pThread->Unlock();                 if(aCacheArray.GetSize()<=0) break;               TP_ComppseSameUpdateData(aCacheArray);//去掉相同的                             for(INT l=0;l              {
                     if(aCacheArray[l]->bToNet)
                     {
                               TP_SendSocketUpdateView(aCacheArray[l]->guidDBType,aCacheArray[l]->eResType,aCacheArray[l]->eNodeType,aCacheArray[l]->guidNode,aCacheArray[l]->guidRes);
                               aCacheArray[l]->bToNet = FALSE;
                     }
              }

              TP_ComppseChildUpdateData(aCacheArray);//合并子项目
              for(INT l = 0;l<(INT)aCacheArray.GetSize();l++)
              {                           if(!pResCache  ->m_bUpdateThread || *pbRun == FALSE) //停止刷新后重新取数据
                           {                                        TP_BackUpdateViewData(&pResCache ->m_aUpdateViewData,&aCacheArray,pResCache);
                                     pThread ->SetDataSize(0);
                                     break;    
                           }                              aFromNet.RemoveAll();
                           aGuidRes.RemoveAll();
                           aGuidRes.Add(aCacheArray[l]->guidRes);
                           aFromNet.Add(aCacheArray[l]->bFromNet);                           guidDBType = aCacheArray[l]->guidDBType;
                           eResType   = aCacheArray[l]->eResType;
                           eNodeType  = aCacheArray[l]->eNodeType;
                           bFromNet   = aCacheArray[l]->bFromNet;                              for(INT k= (INT)aCacheArray.GetSize() -1 ;k> l;k--)
                           {
                                  if(aCacheArray[k] ->eResType == eResType   && aCacheArray[k] ->guidDBType == guidDBType) //前面已经合并了相同的,此处删除相同项的处理
                                  {   
                                            aGuidRes.Add(aCacheArray[k]->guidRes);
                                            eNodeType |= aCacheArray[k]->eNodeType;
                                            bFromNet  |= aCacheArray[l]->bFromNet;
                                            delete aCacheArray[k];
                                            aCacheArray.RemoveAt(k);    
                                  }
                           }                             //  一种eResType发送一次CTPMessageCenter::PostMessageEx
                           stuRfresh.guidDBType =  guidDBType;
                           stuRfresh.aGuidList.Copy(aGuidRes);
                           stuRfresh.bSendMsg   = FALSE;
                           stuRfresh.eResType  = eResType;
                           stuRfresh.eNodeType = eNodeType;
                           CTPMessageCenter::PostMessageEx(WM_UPDATEVIEWMESSAGE,(WPARAM)&stuRfresh,(LPARAM)hEvent);
                           ::WaitForSingleObject(hEvent,INFINITE);
  
                  }
                 for(INT l = 0;l                 aGuidRes.RemoveAll(); 
          }
          ::CloseHandle(hEvent);          pResCache ->m_stuUpdateThread.m_bThreadRun = FALSE;          pResCache ->m_pResCache ->ClearDeleteObject();          return 1;
} // 发送激活数据TPCacheUpdateData,启动激活线程TP_UpdateViewThreadvoid  CTPResUpdateView::UpdateView(GUID guidDBType,TP_RES_TYPE eResType,TP_NODE_TYPE eNodeType,GUID guidNode,GUID guidRes,BOOL bToNet )

       if(!(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)) bToNet = FALSE;//发网络通知命令       if(!m_bUpdateThread) 
       {
              m_stuUpdateThread.Lock();
              TPCacheUpdateData *pAddUpdateData =  new TPCacheUpdateData   (guidDBType,eResType,eNodeType,guidNode,guidRes,bToNet,FALSE);
              m_aUpdateViewData.Add(pAddUpdateData); 
              m_stuUpdateThread.Unlock();
              return;     
       }
       else
       {    
              m_stuUpdateThread.Lock();
              TPCacheUpdateData *pAddUpdateData =  new TPCacheUpdateData(guidDBType,eResType,eNodeType,guidNode,guidRes,bToNet,FALSE);
              m_aUpdateViewData.Add(pAddUpdateData); 
              m_stuUpdateThread.Unlock();              m_stuUpdateThread.SetDataSize(1);              if(!m_stuUpdateThread.m_bThreadRun)
                     m_stuUpdateThread.BeginThread(TP_UpdateViewThread,this);               else                     m_stuUpdateThread.SetDataEvent();
        }
} //添加m_aRegisterID
void  CTPResUpdateView::RegisterID(DWORD dwID,void (*funUpdate)(DWORD,GUID,TP_RES_TYPE ,TP_NODE_TYPE,LPARAM))
{
       for(INT_PTR l=0;l           if(m_aRegisterID[l].dwID == dwID) return;
         m_aRegisterID.Add(TPCacheRegister(dwID,funUpdate)); } //删除m_aRegisterID
BOOL  CTPResUpdateView::UnregisterID(DWORD dwID)

       for(INT_PTR l=0;l       {
              if(m_aRegisterID[l].dwID == dwID)
              {
                     m_aRegisterID.RemoveAt(l);
                     break;
              }
       }        return g_aResCache.GetSize()>0;

void  CTPResUpdateView::TransMsg()
{
 TP_TransMessage(WM_RESOPERATEMESSAGE);
} // 函数中加TPResLockView,来停止UpdateView,TPResLockView析构时在UpdateView
void  CTPResUpdateView::SetLockUpdateView(BOOL bUpdateView)
{       if(m_bUpdateThread == bUpdateView) 
           return;
       if(!bUpdateView)
       {   
              m_bUpdateThread  = FALSE;
              g_pCurResCache ->m_bLockCache   = TRUE;
              TransMsg();
       }
       else
       {      
                 m_bUpdateThread  = TRUE;
                 g_pCurResCache ->m_bLockCache     = FALSE;
                 int iSize = 0;
                 m_stuUpdateThread.Lock();
                 iSize = m_aUpdateViewData.GetSize();   
                 m_stuUpdateThread.Unlock();
                if(iSize>0)
                {
                           m_stuUpdateThread.SetDataSize(1);                           if(!m_stuUpdateThread.IsRun())
                               m_stuUpdateThread.BeginThread(NULL,NULL);
                           else
                               m_stuUpdateThread.SetDataEvent();
                 }       }
}
v oid  CTPResUpdateView::ClearDeleteObject()
{
 ASSERT(0);
} //Refresh FileUINT TP_RefreshClipThread(LPVOID pVoid,BOOL *pbRun,CTPBaseThread *pThread)

       CTPResUpdateView *pResRefresh = (CTPResUpdateView *) pVoid;
       HANDLE            hEvent      = ::CreateEvent(0,FALSE,FALSE,0);
       while(*pbRun &&  pResRefresh ->m_stuRefreshThread)
       {
              CArray aData;
              pThread.Lock();
              aData.Copy(pResRefresh ->m_aRefreshData);
              pResRefresh ->m_aRefreshData.RemoveAll();
              pThread.Unlock();                if(aData.GetSize()<=0) break;              TP_ComppseSameRefreshData(aData); //同上
              for(int l=0;l              {
                           while(g_pResCallBack && !g_pResCallBack->TP_GetbIsEngineIdle())
                           {
                                  if(*pbRun == FALSE) break;
                                  ::Sleep(10000);
                           } 
                           if(!pResRefresh ->m_bRefreshThread  && *pbRun == FALSE)
                           {
                                     pThread.Lock();
                                     for(INT k=0;k                                     {
                                            pResRefresh->m_aRefreshData.InsertAt(k,aData[k]);
                                     }
                                     pThread.Unlock();
                                     aData.RemoveAll();
                                     break;
                           }                          CTPMessageCenter::PostMessageEx(WM_REFRESHCLIPMESSAGE,(WPARAM)aData[l],(LPARAM)hEvent);    
                           ::WaitForSingleObject(hEvent,INFINITE);
              }
              for(int l=0;l                     delete aData[l];
              aData.RemoveAll();  
       }
       ::CloseHandle(hEvent);       return 1;
} //控制是否RefreshClip
void   CTPResUpdateView::SetLockRefreshClip(BOOL bLock)
{
    if(m_bRefreshThread == bLock) return;
    if(!bLock)
    {
           m_bRefreshThread = bLock;
           TransMsg();
    }
    else
    {
           int iSize = 0;
           m_bRefreshThread = bLock;
           m_stuRefreshThread.Lock();
           iSize = m_aRefreshData.GetSize();
           m_stuRefreshThread.Unlock();
           if(iSize >0  )           {
                    if(!m_stuRefreshThread.IsRun())
                              m_stuRefreshThread.BeginThread(TP_RefreshClipThread,this);
                    else
                              m_stuRefreshThread.SetDataEvent();     
    }
} //
LRESULT   CTPResUpdateView::RefreshClip(TPRefreshRes &stuData)
{
       TPRefreshRes *pReshData = new TPRefreshRes;
       *pReshData = stuData;
       m_stuRefreshThread.Lock();
       m_aRefreshData.Add(pReshData);
       m_stuRefreshThread.Unlock();       if(!m_bRefreshThread) return S_OK;
       m_stuRefreshThread.SetDataSize(1);
       if(!m_stuRefreshThread.IsRun())
              m_stuRefreshThread.BeginThread(TP_RefreshClipThread,this);
       else
              m_stuRefreshThread.SetDataEvent();       return S_OK;} 
LRESULT   CTPResUpdateView::DeleteResNotify(GUID guidDBType,GUID guidCatalog,HRESDATA hResData,TP_RES_TYPE eResType,GUID guidRes,long lLock,TPResDelParam *pDelParam,BOOL bNetSend)
{
       TPResData *pstuResData = new TPResData;
       pstuResData->guidDBType = guidDBType;
       pstuResData->guidNode   = guidCatalog;
       pstuResData->eResType   = eResType;
       pstuResData->guidRes    = guidRes;
       pstuResData->hResData   = hResData;
       pstuResData->lParam     = (LPARAM)pDelParam;
       pstuResData->lEffParam  = lLock;       CTPMessageCenter::PostMessageEx(WM_RESOPERATEMESSAGE,1,(LPARAM)pstuResData);       if(bNetSend) TP_SendSocketDeleteRes(guidDBType,guidCatalog,eResType,guidRes,lLock);       return S_OK;
}
LRESULT   CTPResUpdateView::DeleteGuiRes(GUID guidDBType,GUID guidCatalog,HRESDATA hResData,TP_RES_TYPE eResType,GUID guidRes,TPResDelParam *pDeleteData)
{
       TPResData *pstuResData = new TPResData;
       pstuResData->guidDBType = guidDBType;
       pstuResData->guidNode   = guidCatalog;
       pstuResData->eResType   = eResType;
       pstuResData->guidRes    = guidRes;
       pstuResData->hResData   = hResData;
       pstuResData->lParam     = (LPARAM)pDeleteData;
         CTPMessageCenter::PostMessageEx(WM_RESOPERATEMESSAGE,2,(LPARAM)pstuResData);       return S_OK;
}
LRESULT   CTPResUpdateView::BaseResRename(GUID guidDBType,GUID guidCatalog,GUID guidRes,TP_RES_TYPE dwResTYpe,LPCTSTR sName,BOOL bNetSend)
{
       TPResData *pstuResData = new TPResData;
       TCHAR     *pName       = new TCHAR[MAX_PATH];
       lstrcpyn(pName,sName,MAX_PATH);
       pstuResData->guidDBType = guidDBType;
       pstuResData->guidNode   = guidCatalog;
       pstuResData->eResType   = dwResTYpe;
       pstuResData->guidRes    = guidRes;
        pstuResData->lParam     = (LPARAM)pName;       CTPMessageCenter::PostMessageEx(WM_RESOPERATEMESSAGE,3,(LPARAM)pstuResData);       if(bNetSend) TP_SendSocketRenameRes(guidDBType,guidCatalog,dwResTYpe,guidRes,sName);
       return S_OK;
} void  TP_BackUpdateNetData(TPSockCommandPtrArray *paCache,TPSockCommandPtrArray *paCurrent,CTPResUpdateView *pResCache )// 恢复回原来的数据
{
    pResCache ->m_stuNetRefreshThread.Lock();
    for(INT l=0;lGetSize();l++)
        paCache->InsertAt(l,paCurrent->GetAt(l));
    paCurrent->RemoveAll();
    pResCache ->m_stuNetRefreshThread.Unlock();
}
UINT TP_UpdateNetThread( LPVOID pParam ,BOOL *pbRun,CTPBaseThread *pThread)
{
       if(pParam == NULL)   return 1;
       CTPResUpdateView *pResCache = (CTPResUpdateView *)(CTPResUpdateView*)(DWORD_PTR)pParam;      if(*pbRun = FALSE)    return 1;
       HANDLE  hEvent   = ::CreateEvent(0,NULL,NULL,0);
       while(*pbRun)
       {
   
                TPSockCommandPtrArray    aCacheArray;
                pThread.Lock();
                aCacheArray.Copy(pResCache ->m_aNetRefreshData);
                pResCache ->m_aNetRefreshData.RemoveAll();   
                pThread.Unlock();                if(aCacheArray.GetSize()<=0) break;                 for(INT l = 0;l<(INT)aCacheArray.GetSize() ;l++)
                 {   
                        if(!pResCache  ->m_bNetRefreshThread || *pbRun == FALSE ) //停止刷新后重新取数据
                        {    
                                TP_BackUpdateNetData(&pResCache ->m_aNetRefreshData,&aCacheArray,pResCache);
                                pThread ->SetDataSize(0);
                                break;//重新循环         
                        }
   
                        CTPMessageCenter::PostMessageEx(WM_UPDATEVIEWNETMESSAGE,(WPARAM)aCacheArray[l],(LPARAM)hEvent);
                        ::WaitForSingleObject(hEvent,INFINITE);   
                  }
                 for(INT l = 0;l                 aCacheArray.RemoveAll();   
            }
            ::CloseHandle(hEvent);
             return 1;} void  CTPResUpdateView::UpdateNet(TPSockCommand *pCmd)
{     if(!m_bNetRefreshThread) 
    {
        m_stuNetRefreshThread.Lock();
        TPSockCommand *pAddUpdateData =  new TPSockCommand ;
        *pAddUpdateData = *pCmd;
        m_aNetRefreshData.Add(pAddUpdateData); 
        m_stuNetRefreshThread.Unlock();
        return;     
    }
    else
    {       
        m_stuNetRefreshThread.Lock();
        TPSockCommand *pAddUpdateData =  new TPSockCommand ;
        *pAddUpdateData = *pCmd;
        m_aNetRefreshData.Add(pAddUpdateData); 
        m_stuNetRefreshThread.Unlock();        m_stuNetRefreshThread.SetDataSize(1);        if(!m_stuNetRefreshThread.IsRun())
               m_stuNetRefreshThread.BeginThread(TP_UpdateNetThread,this);
        else 
               m_stuNetRefreshThread.SetDataEvent();       }
} void  CTPResUpdateView::SetLockUpdateNet(BOOL bUpdateView)
{       if(m_bNetRefreshThread == bUpdateView) 
           return;
       if(!bUpdateView)
       {   
           m_bNetRefreshThread  = FALSE;
           TransMsg();
       }
       else
       {      
              m_bNetRefreshThread  = TRUE;

               int iSize = 0;
               m_stuNetRefreshThread.Lock();
               iSize = m_aNetRefreshData.GetSize();   
               m_stuNetRefreshThread.Unlock();
               if(iSize>0)
              {
                     m_stuNetRefreshThread.SetDataSize(1);
                     if(!m_stuNetRefreshThread.IsRun())
                           m_stuNetRefreshThread.BeginThread(TP_UpdateNetThread,this);
                     else 
                           m_stuNetRefreshThread.SetDataEvent();
                 }
         }

UINT TP_GetResThread(void *pVoid,BOOL *bThread,CTPBaseThread *pThread)
{
       CTPResUpdateView *pUpdateView = (CTPResUpdateView *)pVoid;
       while(*bThread)
       {
              TPResData stuData;
              pThread.Lock();
              if(pUpdateView->m_aGetResData.GetSize()<=0)
              {                        pThread->SetDataSize(0);
                        pUpdateView->m_stuGetResThread.Unlock();
                        break;
              }
              stuData = pUpdateView ->m_aGetResData[0];
              pUpdateView ->m_aGetResData.RemoveAt(0);
              pThread.Unlock();
              pUpdateView->GetResData(stuData); // 取对应的CTPResClipCache和CTPResProgramCache信息
       }
      return 1;
}
void CTPResUpdateView::GetResThread(TPResDataArray &aResData)
{
       m_stuGetResThread.Lock();
       m_aGetResData.RemoveAll();
       m_aGetResData.Copy(aResData);
       m_stuGetResThread.Unlock();
       if(!m_stuGetResThread.IsRun())
           m_stuGetResThread.BeginThread(TP_GetResThread,this);      else
           m_stuGetResThread.SetDataEvent();
}     void   TP_SendSocketNotifyResFile(TPRefreshRes &stuRefresh)
{
 if(stuRefresh.guidDBType == GUID_LOCALDB) return;
 if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
 {
  stu_TPSockCommand stuCmd;
  stuCmd.uCmd         = TP_SOCKCOMMAND_UPDATEFILE;   
  stuCmd.guidDBType   = stuRefresh.guidDBType;
  stuCmd.guidRes      = GUID_NULL;
  stuCmd.eResType     = TP_RES_CLIP;
   stuCmd.dwParam3     = stuRefresh.eType;  if(stuRefresh.bToTLWnd)    stuCmd.dwParam2 |= 0x00000001;
  if(stuRefresh.bToGui)      stuCmd.dwParam2 |= 0x00000002;
  if(stuRefresh.bFromML)     stuCmd.dwParam2 |= 0x00000004;
  if(stuRefresh.bSendMsg)    stuCmd.dwParam2 |= 0x00000008;
  if(stuRefresh.bToTLData)   stuCmd.dwParam2 |= 0x00000010;  for(INT l=0;l  {
   stuCmd.guidRes   = stuRefresh.aGuidList[l];
   g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand));
  }
 }
}
void TP_SendSocketCaptureFlag(GUID guidDBType,GUID guidRes,UINT uFlag)
{  
  if(guidDBType == GUID_LOCALDB) return;
  if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
  {
   stu_TPSockCommand stuCmd;
   stuCmd.uCmd         = TP_SOCKCOMMAND_CAPTURECLAG;   
   stuCmd.guidDBType   = guidDBType;
   stuCmd.guidRes      = guidRes;
   stuCmd.eResType     = TP_RES_CLIP;
   stuCmd.dwParam2     = uFlag;
   g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand));
  }
 
}
void TP_SendSocketValutsChange(GUID guidDBType)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
 {
  stu_TPSockCommand stuCmd;
  stuCmd.uCmd         = TP_SOCKCOMMAND_VALUTS;
  stuCmd.guidDBType   = guidDBType;
  g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand));
 }
}
void TP_SendSocketOpenProject(GUID guidDBType,GUID guidNode,GUID guidProject,BOOL bOpen)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
 {
  stu_TPSockCommand stuCmd;
  stuCmd.uCmd         = TP_SOCKCOMMAND_OPENPRJ;
  stuCmd.guidDBType   = guidDBType;
  stuCmd.guidRes      = guidProject;
  stuCmd.guidNode     = guidNode;
  stuCmd.dwParam1     = bOpen;
  stuCmd.guidParam1   = g_pUserEnterInfo->guidTeamSpaceUser;
  g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand));
  g_pTeamCmdProxy ->SetPrjOpen(GUID_NULL,guidDBType,guidProject,bOpen);
  g_pTeamCmdProxy ->SendTickCount();
 }
}
void TP_SendSocketOpenProjectState(CTPResProject *pCatalog)
{
 if(pCatalog ->m_guidDBType == GUID_LOCALDB) return;
 if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
 {  
  pCatalog ->m_lOpenCount= g_pTeamCmdProxy ->GetPrjOpen(GUID_NULL,pCatalog ->m_guidDBType,pCatalog ->m_guidRes);
 }
}
void  TP_SendSocketUpdateView(GUID guidDBType,TP_RES_TYPE eResType,TP_NODE_TYPE eNodeType,GUID guidNode,GUID guidRes)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
 {
  stu_TPSockCommand stuCmd;
  stuCmd.uCmd         = TP_SOCKCOMMAND_UPDATE;
  stuCmd.guidDBType   = guidDBType;
  stuCmd.guidRes      = guidRes;
  stuCmd.guidNode     = guidNode;
  stuCmd.eResType     = eResType;
  stuCmd.eNodeType    = eNodeType;
  g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand));
 }
}
void TP_SendSocketDeleteRes(GUID guidDBType,GUID guidCatalog,TP_RES_TYPE eResType,GUID guidRes,long lLock)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(!(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)) return;
 
 TPSockCommand stuCmd;
 stuCmd.uCmd         = TP_SOCKCOMMAND_DELRES;
 stuCmd.guidDBType   = guidDBType;
 stuCmd.guidRes      = guidRes;
 stuCmd.guidNode     = guidCatalog;
 stuCmd.eResType     = eResType;
 stuCmd.dwParam2     = lLock;
 g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand)); 
}
void TP_SendSocketDeleteCatalog(GUID guidDBType,GUID guidRes,TP_RES_TYPE eResType,BOOL bDelete)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(!(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)) return; TPSockCommand stuCmd;
 stuCmd.uCmd         = TP_SOCKCOMMAND_DELCATALOG;
 stuCmd.guidDBType   = guidDBType;
 stuCmd.guidRes      = guidRes;
  stuCmd.eResType     = eResType;
 stuCmd.dwParam2     = bDelete;
 g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand)); 
}
 
void TP_SendSocketOpenProgram(GUID guidDBType,GUID guidRes,BOOL bOpen)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
 {
  stu_TPSockCommand stuCmd;
  stuCmd.uCmd         = TP_SOCKCOMMAND_OPENPROGRAM;
  stuCmd.guidDBType   = guidDBType;
  stuCmd.guidRes      = guidRes;
   stuCmd.dwParam1     = bOpen;
  stuCmd.guidParam1   = g_pUserEnterInfo->guidTeamSpaceUser;
  g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand));
  g_pTeamCmdProxy ->SetProOpen(GUID_NULL,guidDBType,guidRes,bOpen);
  g_pTeamCmdProxy ->SendTickCount();
 }
}
void TP_SendSocketOpenProgramState(CTPResProgramCache *pProgram)
{
 if(pProgram ->m_guidDBType == GUID_LOCALDB) return;
 if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
 {
  pProgram ->m_lOpenCount= g_pTeamCmdProxy ->GetProOpen(GUID_NULL,pProgram ->m_guidDBType,pProgram ->m_guidRes); }
}
void TP_SendSocketRenameTeam(GUID guidDBType,LPCTSTR sName)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
 {
  stu_TPSockCommand stuCmd;
  stuCmd.uCmd         = TP_SOCKCOMMAND_RENAMETEAM;
  stuCmd.guidDBType   = guidDBType;
  lstrcpyn(stuCmd.cNotify,sName,80); 
  g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand));
 }
}
BOOL TP_SendAskDeleteTeam(LPBYTE pBuffer,long lSize,LPVOID lParam)

 if(lSize stu_TPSockCommand *pCmd = (stu_TPSockCommand *)pBuffer;
 if(pCmd->dwParam1 == FALSE)
 {
  *(stu_TPSockCommand *)lParam = *pCmd;
  return FALSE;
 }
 return TRUE;
}LRESULT TP_SendSocketDeleteTeam(GUID guidDBType,TPResTeamDataBase *pTeamSpace,BOOL bUnJion)
{
 if(guidDBType == GUID_LOCALDB) return S_OK;
 if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
 {
  stu_TPSockCommand stuCmd;
  stuCmd.uCmd         = TP_SOCKCOMMAND_DELETETEAM;
  stuCmd.guidDBType   = guidDBType;
  stuCmd.dwParam3      = bUnJion;
  stuCmd.dwParam1      = TRUE; // 默认可以删除
  g_pTeamCmdProxy ->SendAskCmd((LPBYTE)&stuCmd,sizeof(stu_TPSockCommand),TP_SendAskDeleteTeam,(LPVOID)&stuCmd);
  pTeamSpace ->sMessage = stuCmd.cNotify;
  return stuCmd.dwParam1? S_OK:S_FALSE;
 }
 return S_OK;
}
void TP_SendSocketUpdateTLSave(GUID guidDBType,TP_RES_TYPE eResType,GUID guidRes)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)
 {
  stu_TPSockCommand stuCmd;
  stuCmd.uCmd         = TP_SOCKCOMMAND_UPDATEFILE;   
  stuCmd.guidDBType   = guidDBType;
  stuCmd.guidRes      = guidRes;
  stuCmd.eResType     = eResType;
  stuCmd.dwParam2     = 0x00000010;
  stuCmd.dwParam3     = 0;  g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand));  
 }
}
void TP_SendSocketResColor(GUID guidDBType,TP_RES_TYPE eResType,GUID guidRes,COLORREF clColor)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(!(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)) return; TPSockCommand stuCmd;
 stuCmd.uCmd         = TP_SOCKCOMMAND_RESCOLOR;
 stuCmd.guidDBType   = guidDBType;
 stuCmd.guidRes      = guidRes; 
  stuCmd.eResType     = eResType;
 stuCmd.dwParam2     = clColor;
  g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand)); 
}void TP_SendSocketResShare(GUID guidDBType,TP_RES_TYPE eResType,GUID guidNode,GUID guidRes,UINT bShare)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(!(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)) return; TPSockCommand stuCmd;
 stuCmd.uCmd         = TP_SOCKCOMMAND_SHARE;
 stuCmd.guidDBType   = guidDBType;
 stuCmd.guidRes      = guidRes; 
 stuCmd.guidNode     = guidNode; 
 stuCmd.eResType     = eResType;
 stuCmd.dwParam2     = bShare;
 g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand)); 
}
void TP_SendSocketResReadOnly(GUID guidDBType,TP_RES_TYPE eResType,GUID guidRes,UINT bShare)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(!(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)) return; TPSockCommand stuCmd;
 stuCmd.uCmd         = TP_SOCKCOMMAND_READONLY;
 stuCmd.guidDBType   = guidDBType;
 stuCmd.guidRes      = guidRes; 
 stuCmd.eResType     = eResType;
 stuCmd.dwParam2     = bShare;
 g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand)); 
}
void TP_SendSocketEdiRefresh(GUID guidDBType,TP_RES_TYPE eResType,GUID guidRes,long lLength)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(!(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)) return; TPSockCommand stuCmd;
 stuCmd.uCmd         = TP_SOCKCOMMAND_EDIREFRESH;
 stuCmd.guidDBType   = guidDBType;
 stuCmd.guidRes      = guidRes; 
 stuCmd.eResType     = eResType;
 stuCmd.dwParam2     = lLength;
 g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand)); 
}
void TP_SendSocketRenameRes(GUID guidDBType,GUID guidCatalog,TP_RES_TYPE eResType,GUID guidRes,LPCTSTR sName)
{
 if(guidDBType == GUID_LOCALDB) return;
 if(!(g_pSystemInfo ->uSystemState & TP_SYSTEMSTATE_TEAMMODE)) return; TPSockCommand stuCmd;
 stuCmd.uCmd         = TP_SOCKCOMMAND_RENAMERES;
 stuCmd.guidDBType   = guidDBType;
 stuCmd.guidRes      = guidRes; 
 stuCmd.guidNode     = guidCatalog; 
 stuCmd.eResType     = eResType;
 lstrcpyn(stuCmd.cNotify,sName,79);
 g_pTeamCmdProxy ->SendBaseCmd(TPTeamCmd_TeamCmd,(LPBYTE)&stuCmd,sizeof(stu_TPSockCommand)); 
}   #define TP_SOCKCOMMAND_DELRES        3
#define TP_SOCKCOMMAND_UPDATE        4
#define TP_SOCKCOMMAND_RENAME        5
#define TP_SOCKCOMMAND_USERSIZE      7 
#define TP_SOCKCOMMAND_UPDATEFILE    8 
#define TP_SOCKCOMMAND_VALUTS        9 
#define TP_SOCKCOMMAND_OPENPRJ       10 
#define TP_SOCKCOMMAND_RENAMERES     12
#define TP_SOCKCOMMAND_CAPTURECLAG   13
//#define TP_SOCKCOMMAND_ASKDELETE     14
#define TP_SOCKCOMMAND_ASKOPENPRG        15
#define TP_SOCKCOMMAND_ASKOPENEFFTEMP    16
#define TP_SOCKCOMMAND_OPENPROGRAM       17
#define TP_SOCKCOMMAND_RENAMETEAM        18
#define TP_SOCKCOMMAND_DELETETEAM        19
#define TP_SOCKCOMMAND_RESCOLOR          20
#define TP_SOCKCOMMAND_SHARE             21
#define TP_SOCKCOMMAND_READONLY          22
#define TP_SOCKCOMMAND_ASKPRJISOPEN      23
#define TP_SOCKCOMMAND_DELCATALOG        24
#define TP_SOCKCOMMAND_EDIREFRESH        25 //注意采集等等都在用#define TP_SOCKCOMMAND_VERSION           3typedef struct stu_TPSockCommand
{
 BYTE       vVersion;
 UINT       uCmd;
 GUID       guidDBType;
 GUID       guidNode;
 GUID       guidRes;
 ULONGLONG  eNodeType;
 ULONGLONG  eResType;
 DWORD      dwParam1;
 DWORD      dwParam2;
 DWORD      dwParam3;
 GUID       guidParam1;
 
 //DWORD      dwIndentifer;
 TCHAR      cNotify[80];
 //long       lLength;
 //BYTE       pBuffer[4];
 LPARAM      lParam;
 stu_TPSockCommand()
 {
  ZeroMemory(this,sizeof(stu_TPSockCommand));
  vVersion = TP_SOCKCOMMAND_VERSION;
 }
}TPSockCommand;
typedef CArray    TPSockCommandArray;
typedef CArray  TPSockCommandPtrArray;  typedef void (*AFX_LOCKVIEWPROC)(BOOL);#define TPLOCKVIEW_RES          0
#define TPLOCKVIEW_BRD          1
#define TPLOCKVIEW_REFRESHFILE  2
#define TPLOCKVIEW_ENGINEBUSY   3struct AFX_EXEX_CLASS TPLockView
{
public:
 TPLockView(BOOL bLockInit,int iIndexInit)
 {
   bLock  = FALSE;
  iIndex = iIndexInit;
  if(bLockInit) Lock( );
 }
 ~TPLockView()
 {
  if(bLock) Unlock();
 }
 static void SetLockFun(void (*f)(BOOL),int iIndexInit)
 {
  LockUpdateView[iIndexInit] = f;
  lLockRefer[iIndexInit]     = 0;
 }
 void Lock()
 {
  if(bLock) return;
  bLock = TRUE;  if(lLockRefer[iIndex] == 0 && LockUpdateView[iIndex])
   LockUpdateView[iIndex](FALSE);
  InterlockedIncrement(&lLockRefer[iIndex]);
 }
 void Unlock()
 {
  if(!bLock) return;
  bLock = FALSE;  InterlockedDecrement(&lLockRefer[iIndex]);
  if(lLockRefer[iIndex] == 0 && LockUpdateView[iIndex])
   LockUpdateView[iIndex](TRUE);
 }
public:
 int                     iIndex;
 private:
 static AFX_LOCKVIEWPROC LockUpdateView[6];
 static LONG             lLockRefer[6];
 BOOL                    bLock;
};
struct AFX_EXEX_CLASS TPResLockView:public TPLockView
{
 TPResLockView(BOOL bLockInit = TRUE) :TPLockView(bLockInit,TPLOCKVIEW_RES)
 {
 }
};
struct AFX_EXEX_CLASS TPBrdLockView:public TPLockView
{
 TPBrdLockView(BOOL bLockInit = TRUE) :TPLockView(bLockInit,TPLOCKVIEW_BRD)
 {
 }
};
struct AFX_EXEX_CLASS TPRefreshFileLockView:public TPLockView
{
 TPRefreshFileLockView(BOOL bLockInit = TRUE) :TPLockView(bLockInit,TPLOCKVIEW_REFRESHFILE)
 {
 }
};
 
struct AFX_EXEX_CLASS TPEnginBusyLock:public TPLockView
{
 TPEnginBusyLock(BOOL bLockInit = FALSE) :TPLockView(bLockInit,TPLOCKVIEW_ENGINEBUSY)
 {
 }
};


enum TP_RefreshRes_Type
{
 TP_RefreshRes_Unknow  ,
 TP_RefreshRes_Abrige = 100,
 TP_RefreshRes_GroupClip,
 TP_RefreshRes_DeleteClipQualit,
 TP_RefreshRes_BatchDigitizeSG,
 TP_RefreshRes_BacktoCreateSG,
 TP_RefreshRes_BatchDigitizeCD,
 TP_RefreshRes_BacktoCreateCD,
 TP_RefreshRes_BatchDigitizeDVD,
 TP_RefreshRes_BacktoCreateDVD,
 TP_RefreshRes_BatchDigitizeImportFile,
 TP_RefreshRes_BacktoCreateImportFile,
 TP_RefreshRes_BatchDigitizeVACapture,
 TP_RefreshRes_BacktoCreateVACapture,
 TP_RefreshRes_BatchDigitizeRendToBin,
 TP_RefreshRes_BacktoCreateRendToBin, 
 TP_RefreshRes_P2Import, 
 TP_RefreshRes_BrdImport,
 TP_RefreshRes_VOTake, 
 TP_RefreshRes_ClipModify,
 TP_RefreshRes_BacktoCreateTM,
 TP_RefreshRes_BacktoCreateSpeedClip,
 TP_RefreshRes_BatchDigitizeAll,
 TP_RefreshRes_TeamEdi,
#ifdef TP_NS_NET
 TP_RefreshRes_SVCaptureFlag,
#endif 
};
 
struct TPRefreshRes

 TP_RefreshRes_Type eType;     //刷新类型
  BOOL               bSendMsg;  //刷新消息是                            PostMessage 还是 SendMessage
 GUID               guidDBType;//资源数据库标记
 CGuidArray     aGuidList; //资源GUID
 BOOL               bToGui;    //发送给时间线之外的所有截面             TP_RES_REFRESH_CALLBACK
 BOOL               bToTLWnd;  //发送给时间线                           TP_TIMELINE_IMPORTCLIP
 BOOL               bToTLData; //网络时间线存盘,
 BOOL               bFromML;   //系统非编特殊标记来自外部ML的刷新命令   TP_TIMELINE_IMPORTCLIP_ML_REFRESH
 LPARAM             lParam;
 
 BOOL               bToNet;    //是否命令发送给网络 Team 专用 GUID               guidNode;
 TP_RES_TYPE        eResType;
 TP_NODE_TYPE       eNodeType; TPRefreshRes()
 {  
  eType        = TP_RefreshRes_Unknow;
   bSendMsg     = FALSE;
  guidDBType   = GUID_NULL;
  bToGui       = TRUE;
  bToTLWnd     = TRUE;
  bToTLData    = FALSE;
  bFromML      = FALSE;
   bToNet       = TRUE;
  lParam       = NULL;
 }
 void Reset()
 {
  eType        = TP_RefreshRes_Unknow;
  bSendMsg     = FALSE;
  bToGui       = FALSE;
  bToTLWnd     = FALSE;
  bToTLData    = FALSE;
  bFromML      = FALSE;
  bToNet       = FALSE;
  lParam       = NULL;
 }
 BOOL Compare(TPRefreshRes *pOther)
 {
  if(eType        != pOther ->eType)      return FALSE;
  if(bSendMsg     != pOther ->bSendMsg)   return FALSE;
  if(guidDBType   != pOther ->guidDBType) return FALSE; 
  if(bToGui       != pOther ->bToGui)     return FALSE;
  if(bToTLWnd     != pOther ->bToTLWnd)   return FALSE;
  if(bToTLData    != pOther ->bToTLData)  return FALSE;
 
  if(bFromML      != pOther ->bFromML)    return FALSE;
  if(bToNet       != pOther ->bToNet)     return FALSE;
  return TRUE;
 }
 TPRefreshRes( GUID guidDBType,GUID guidRes,BOOL bSendMsg =TRUE)
 {
  this->eType        = TP_RefreshRes_Unknow;
   this->bSendMsg     = bSendMsg;
  this->guidDBType   = guidDBType;
  this->aGuidList.Add(guidRes);
  this->bToGui       = TRUE;
  this->bToTLWnd     = TRUE;
  this->bToTLData    = FALSE;
  this->bFromML      = FALSE;
  this->bToNet       = TRUE;
  this->lParam       = NULL;
  }
 TPRefreshRes( GUID guidDBType,CGuidArray &aGuidList,BOOL bSendMsg =TRUE)
 {
  this->eType        = TP_RefreshRes_Unknow;
   this->bSendMsg     = bSendMsg;
  this->guidDBType   = guidDBType;
  this->aGuidList.Copy(aGuidList);
  this->bToGui       = TRUE;
  this->bToTLWnd     = TRUE;
  this->bToTLData    = FALSE;
  this->bFromML      = FALSE;
  this->bToNet       = TRUE;
  this->lParam       = NULL;
 }
 TPRefreshRes &operator = (TPRefreshRes &other)
 {
  eType         = other.eType ;
   bSendMsg      = other.bSendMsg;
  guidDBType    = other.guidDBType;
  bToGui        = other.bToGui;
  bToTLWnd      = other.bToTLWnd;
  bToTLData     = other.bToTLData;
  bFromML       = other.bFromML;
   bToNet        = other.bToNet;
  lParam        = other.lParam;  aGuidList.Copy(other.aGuidList);
  return *this;
 }
};
typedef CArray TPRefreshResArray;