一:全局基於單文檔MFC程序開發。
二:全局每個功能模塊之間完全隔離, 模塊之間的數據交流必須使用主板模板。
三:每個功能塊全部都自己的線程,除了PLC功能塊 其他都是窗口線程
四:各個功能命名的前綴依次是:
硬件功能模組:CGszBoard
HMI模組:CGszHmi
CCD模組:CGszCcd
PLC模組:CGszPlc
運動模組:CGszMotion
數據庫模組:CGszDataBase
通訊模組:CGszCommunication
主板總線模組:CGszMainDataBus
×××××××××××××××××××××××××××××
五:在App的頭文件里面聲明 線程函數依次是:
硬件功能模組:static UINT Scada_GszBoard(LPVOID pParam);
HMI模組:static UINT Scada_GszHmi(LPVOID pParam)
CCD模組:static UINT Scada_GszCcd(LPVOID pParam)
PLC模組:static UINT Scada_GszPlc(LPVOID pParam)
運動模組:static UINT Scada_GszMotion(LPVOID pParam)
數據庫模組:static UINT Scada_GszDataBase(LPVOID pParam)
通訊模組:static UINT Scada_GszCommunication(LPVOID pParam)
主板總線模組:該模組不需要線程
六:在App的實現文件(就是CPP)文件里去實現這些七個函數。
七:上述線程分為兩類一類是有臉的 一類是無臉的。使用不同全局函數 將上述函數定義為線程函數
首先有臉線程函數的定義方式:
CWinThread* AfxBeginThread ( CRuntimeClass* pThreadClass,//從CWinThread派生的RUNTIME_CLASS類; intnPriority=THREAD_PRIORITY_NORMAL,//線程優先級,如果為0,則與創建該線程的線程相同; UINT nStackSize=0,//線程的堆棧大小,如果為0,則與創建該線程的線程相同; DWORD dwCreateFlags=0,//一個創建標識,如果是CREATE_SUSPENDED,則在懸掛狀態創建線程,在線程創建后線程掛起,否則線程在創建后開始線程的執行。 LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL//線程的安全屬性,NT下有用。 );
然后是無臉函數的定義方式:
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc,//指向工作者線程的執行函數的指針,線程函數原型必須聲明如下: UINTExecutingFunction(LPVOID pParam); LPVOID pParam,//傳遞給線程函數的一個32位參數,執行函數將用某種方式解釋該值。它可以是數值,或是指向一個結構的指針,甚至可以被忽略; nPriority=THREAD_PRIORITY_NORMAL,//線程的優先級。如果為0,則線程與其父線程具有相同的優先級; UINTnStackSize=0,//線程為自己分配堆棧的大小,其單位為字節。如果nStackSize被設為0,則線程的堆棧被設置成與父線程堆棧相同大小; DWORDdwCreateFlags=0,//如果為0,則線程在創建后立刻開始執行。如果為CREATE_SUSPEND,則線程在創建后立刻被掛起; LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL//線程的安全屬性指針,一般為NULL; );
八:程序設計過程會使用到很多庫, 配置編譯器使編譯器可以兼容這些庫
九:在各個模塊里面書寫函數。 在線程函數里面實例化他們。套用個文詞吧。畫龍點睛。。。 定義了那么多類 ,最后如果不去實例化 都是扯了。。
實例化就是畫龍點睛。