边际效用递减例子: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;
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
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
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;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;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
m_aUpdateViewData.RemoveAll();
m_stuNetRefreshThread.EndThread(m_stuNetRefreshThread.m_hDefaultEvent[0]);
for(INT l=0;l
m_aNetRefreshData.RemoveAll(); m_stuRefreshThread.EndThread(); for(INT l=0;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;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
}
::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
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
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
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;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
}
::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
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
typedef CArray
#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