1.CGlassPool实现;
2.CGlass翻译逻辑优化;
3.在Glass列表页,Glass项的显示,增加显示贴合的Glass的id
已添加2个文件
已修改14个文件
211 ■■■■■ 文件已修改
SourceCode/Bond/Servo/CArm.cpp 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CDoubleGlass.cpp 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage2.cpp 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlass.cpp 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlass.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlassPool.cpp 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlassPool.h 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.cpp 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Context.cpp 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Context.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.filters 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CArm.cpp
@@ -56,13 +56,17 @@
    int CArm::tempStore(CGlass* pGlass)
    {
        // ä¿è¯åˆ—表中只存储一个物料
        // åŽŸï¼šä¿è¯åˆ—è¡¨ä¸­åªå­˜å‚¨ä¸€ä¸ªç‰©æ–™
        // ä¿®æ”¹ä¸ºï¼šå…ˆæ¸…空之前的,再添加当前pGlass, å¦‚æžœpGlass有buddy,也要加入列表中
        Lock();
        for (auto item : m_glassList) {
            item->release();
        }
        m_glassList.clear();
        addGlassToList(pGlass);
        if (pGlass->getBuddy() != nullptr) {
            addGlassToList(pGlass->getBuddy());
        }
        Unlock();
        if (m_listener.onDataChanged != nullptr) {
SourceCode/Bond/Servo/CDoubleGlass.cpp
@@ -1,5 +1,7 @@
#include "stdafx.h"
#include "Servo.h"
#include "CDoubleGlass.h"
#include "CGlassPool.h"
namespace SERVO {
@@ -72,11 +74,11 @@
            ULONGLONG ulGlass1;
            ar >> ulGlass1;
            if (ulGlass1 != 0) {
                m_pGlass1 = new CGlass();
                m_pGlass1 = theApp.m_model.m_glassPool.allocaGlass();
                m_pGlass1->serialize(ar);
            }
            if (ulGlass1 != 0) {
                m_pGlass2 = new CGlass();
                m_pGlass2 = theApp.m_model.m_glassPool.allocaGlass();
                m_pGlass2->serialize(ar);
            }
SourceCode/Bond/Servo/CEquipment.cpp
@@ -3,6 +3,8 @@
#include "ToolUnits.h"
#include <regex>
#include "CArm.h"
#include "CGlassPool.h"
#include "Servo.h"
#define CHECK_READ_STEP_SIGNAL(addr, data, size) {                            \
@@ -315,7 +317,7 @@
            int count;
            ar >> count;
            for (int i = 0; i < count; i++) {
                CGlass* pGlass = new CGlass();
                CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass();
                pGlass->serialize(ar);
                addGlassToList(pGlass);
            }
SourceCode/Bond/Servo/CEquipmentPage2.cpp
@@ -74,8 +74,9 @@
    ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL);
    m_listCtrl.InsertColumn(0, _T(""), LVCFMT_RIGHT, width[0]);
    m_listCtrl.InsertColumn(1, _T("ID"), LVCFMT_LEFT, width[1]);
    m_listCtrl.InsertColumn(2, _T("时间"), LVCFMT_LEFT, width[2]);
    m_listCtrl.SetColumnWidth(2, LVSCW_AUTOSIZE_USEHEADER);
    m_listCtrl.InsertColumn(2, _T("贴合"), LVCFMT_LEFT, width[2]);
    m_listCtrl.InsertColumn(3, _T("时间"), LVCFMT_LEFT, width[3]);
    m_listCtrl.SetColumnWidth(3, LVSCW_AUTOSIZE_USEHEADER);
    ASSERT(m_pEquipment);
@@ -84,10 +85,14 @@
    for (auto item : list) {
        item->addRef();                
        item->release();        // é‡Šæ”¾list中的引用
        SERVO::CGlass* pBuddy = item->getBuddy();
        int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), _T(""));
        m_listCtrl.SetItemData(index, (DWORD_PTR)item);
        m_listCtrl.SetItemText(index, 1, item->getID().c_str());
        if (pBuddy != nullptr) {
            m_listCtrl.SetItemText(index, 2, pBuddy->getID().c_str());
        }
    }
    return TRUE;  // return TRUE unless you set the focus to a control
SourceCode/Bond/Servo/CGlass.cpp
@@ -12,6 +12,11 @@
    CGlass::~CGlass()
    {
    }
    void CGlass::reset()
    {
        CPath* pPath = m_pPath;
        while (pPath != nullptr) {
            CPath* pTemp = pPath->getNext();
@@ -20,7 +25,7 @@
        }
        m_pPath = nullptr;
        if (m_pBuddy != nullptr    && m_type == MaterialsType::G1) {
        if (m_pBuddy != nullptr) {
            m_pBuddy->release();
        }
    }
SourceCode/Bond/Servo/CGlass.h
@@ -20,6 +20,7 @@
    public:
        CGlass();
        virtual ~CGlass();
        void reset();
    public:
        virtual std::string& getClassName();
SourceCode/Bond/Servo/CGlassPool.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
#include "stdafx.h"
#include "CGlassPool.h"
#define DEFAULT_GLASS_POOL_SIZE                1024
namespace SERVO {
    CGlassPool::CGlassPool()
    {
        InitializeCriticalSection(&m_criticalSection);
    }
    CGlassPool::~CGlassPool()
    {
        DeleteCriticalSection(&m_criticalSection);
    }
    void CGlassPool::initPool()
    {
        auto onReleaseAny = [&](void* pAny) -> void {
            // å›žæ”¶Glass
            freeGlass((CGlass*)pAny);
        };
        // åˆ†é…CGlassæ± 
        Lock();
        for (int i = 0; i < DEFAULT_GLASS_POOL_SIZE; i++) {
            CGlass* pGlass = new CGlass();
            pGlass->setOnRelease(onReleaseAny);
            m_lsitAvailable.push_back(pGlass);
        }
        Unlock();
    }
    void CGlassPool::term()
    {
        Lock();
        for (auto item : m_lsitAvailable) {
            delete item;
        }
        m_lsitAvailable.clear();
        for (auto item : m_mapOccupation) {
            delete item.second;
        }
        m_mapOccupation.clear();
        Unlock();
    }
    CGlass* CGlassPool::allocaGlass()
    {
        Lock();
        CGlass* pGlass = NULL;
        if (!m_lsitAvailable.empty()) {
            pGlass = m_lsitAvailable.front();
            m_lsitAvailable.pop_front();
            m_mapOccupation[pGlass] = pGlass;
        }
        Unlock();
        return pGlass;
    }
    void CGlassPool::freeGlass(CGlass* pGlass)
    {
        // å›žæ”¶CAny
        Lock();
        pGlass->reset();
        auto iter = m_mapOccupation.find(pGlass);
        if (iter != m_mapOccupation.end()) {
            m_lsitAvailable.push_back(iter->second);
            m_mapOccupation.erase(iter);
        }
        Unlock();
    }
    int CGlassPool::getAvailableSize()
    {
        Lock();
        int nSize = (int)(m_lsitAvailable.size());
        Unlock();
        return nSize;
    }
}
SourceCode/Bond/Servo/CGlassPool.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
#pragma once
#include "CGlass.h"
#include <map>
#include <list>
namespace SERVO {
    class CGlassPool
    {
    public:
        CGlassPool();
        ~CGlassPool();
    public:
        void initPool();
        void term();
        CGlass* allocaGlass();
        void freeGlass(CGlass* pGlass);
        int getAvailableSize();
    private:
        inline void Lock() { EnterCriticalSection(&m_criticalSection); }
        inline void Unlock() { LeaveCriticalSection(&m_criticalSection); }
    private:
        CRITICAL_SECTION m_criticalSection;
        std::map<void*, CGlass*> m_mapOccupation;            // ä½¿ç”¨ä¸­çš„
        std::list<CGlass*> m_lsitAvailable;                    // ç©ºé—²çš„
    };
}
SourceCode/Bond/Servo/CLoadPort.cpp
@@ -1,5 +1,7 @@
#include "stdafx.h"
#include "CLoadPort.h"
#include "CGlassPool.h"
#include "Servo.h"
#define CHECK_READ_STEP_SIGNAL2(addr, data, size) {                            \
@@ -533,7 +535,7 @@
                js.setGlass2Id(szBuffer);
            }
            CGlass* pGlass = new CGlass();
            CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass();
            pGlass->setID(szBuffer);
            pGlass->setJobDataB(&jb);
            pGlass->setType(type);
SourceCode/Bond/Servo/CMaster.cpp
@@ -34,11 +34,6 @@
    CMaster::~CMaster()
    {
        for (auto item : m_listEquipment) {
            delete item;
        }
        m_listEquipment.clear();
        if (m_hEventReadBitsThreadExit[0] != nullptr) {
            ::CloseHandle(m_hEventReadBitsThreadExit[0]);
            m_hEventReadBitsThreadExit[0] = nullptr;
@@ -180,6 +175,11 @@
        saveCache();
        for (auto item : m_listEquipment) {
            delete item;
        }
        m_listEquipment.clear();
        return 0;
    }
SourceCode/Bond/Servo/Context.cpp
@@ -4,6 +4,7 @@
CContext::CContext()
{
    m_onReleaseCallback = nullptr;
    m_nRef = 0;
    m_nRetCode = 0;
    m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
@@ -20,6 +21,11 @@
    DeleteCriticalSection(&m_criticalSection);
}
void CContext::setOnRelease(ONRELEASECALLBACK fOnRelease)
{
    m_onReleaseCallback = fOnRelease;
}
int CContext::addRef()
{
    Lock();
@@ -32,13 +38,20 @@
int CContext::release()
{
    Lock();
    m_nRef--;
    BOOL bDelete = m_nRef == 0;
    Unlock();
    if (m_nRef > 0) {
        m_nRef--;
        BOOL bRefCount0 = m_nRef == 0;
        Unlock();
    int nRef = m_nRef;;
    if (bDelete) delete this;
    return nRef;
        if (bRefCount0 && m_onReleaseCallback != nullptr) {
            m_onReleaseCallback(this);
        }
    }
    else {
        Unlock();
    }
    return m_nRef;
}
void CContext::setRetCode(int code)
SourceCode/Bond/Servo/Context.h
@@ -1,6 +1,9 @@
#pragma once
#include "Common.h"
#include <functional>
typedef std::function<void(void*)> ONRELEASECALLBACK;
class CContext : public IRxObject
{
public:
@@ -8,6 +11,7 @@
    virtual ~CContext();
public:
    void setOnRelease(ONRELEASECALLBACK fOnRelease);
    int addRef();
    int release();
@@ -32,6 +36,7 @@
    static BOOL IsLotId(CString& strId);
private:
    ONRELEASECALLBACK m_onReleaseCallback;
    int m_nRef;
    CRITICAL_SECTION m_criticalSection;
SourceCode/Bond/Servo/Model.cpp
@@ -5,6 +5,7 @@
#include "ToolUnits.h"
#include "CEqAlarmStep.h"
#include "AlarmManager.h"
#include "CGlassPool.h"
CModel::CModel()
@@ -45,6 +46,9 @@
    CString strModeType = _T("Master");
    CString strSoftRev = _T("1.0.2");
    // CGlassPool
    m_glassPool.initPool();
    // Log
@@ -182,6 +186,7 @@
    m_hsmsPassive.term();
    CLog::GetLog()->SetOnLogCallback(nullptr);
    m_master.term();
    m_glassPool.term();
    return 0;
}
SourceCode/Bond/Servo/Model.h
@@ -2,6 +2,7 @@
#include "Configuration.h"
#include "HsmsPassive.h"
#include "CMaster.h"
#include "CGlassPool.h"
class CModel
{
@@ -32,6 +33,7 @@
public:
    CConfiguration m_configuration;
    CHsmsPassive m_hsmsPassive;
    SERVO::CGlassPool m_glassPool;
    SERVO::CMaster m_master;
private:
SourceCode/Bond/Servo/Servo.vcxproj
@@ -198,6 +198,7 @@
    <Text Include="ReadMe.txt" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="CGlassPool.h" />
    <ClInclude Include="PageRecipe.h" />
    <ClInclude Include="CDoubleGlass.h" />
    <ClInclude Include="CProcessData.h" />
@@ -295,6 +296,7 @@
    <ClInclude Include="VerticalLine.h" />
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="CGlassPool.cpp" />
    <ClCompile Include="PageRecipe.cpp" />
    <ClCompile Include="CDoubleGlass.cpp" />
    <ClCompile Include="CProcessData.cpp" />
SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -103,6 +103,7 @@
    <ClCompile Include="PageRecipe.cpp" />
    <ClCompile Include="CDoubleGlass.cpp" />
    <ClCompile Include="CProcessData.cpp" />
    <ClCompile Include="CGlassPool.cpp" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="AlarmManager.h" />
@@ -204,6 +205,7 @@
    <ClInclude Include="PageRecipe.h" />
    <ClInclude Include="CDoubleGlass.h" />
    <ClInclude Include="CProcessData.h" />
    <ClInclude Include="CGlassPool.h" />
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Servo.rc" />