模組間互相呼叫的一種方法
在程式設計中,需要把程式根據功能劃分多個模組,多個模組間免不了互相呼叫一些服務函式,這樣會使模組間剪不斷,理還亂!
利用服務中心的思想,可以使各個模組間的關係比較簡單。模組間的呼叫通過中心伺服器交換,彼此沒有聯絡,這樣模組間可以到達低耦合,高內聚。
實現方法:
class baseframe_class civmdlgsrvmgr
;在程式中,定乙個中心伺服器單體:
civmdlgsrvmgr* g_psrvmgr = null;
civmdlgsrvmgr* g_psrvmgr = null;
//// construction/destruction
//civmdlgsrvmgr::civmdlgsrvmgr()
civmdlgsrvmgr::~civmdlgsrvmgr()
civmdlgsrvmgr* civmdlgsrvmgr::instance()
return g_psrvmgr; }
// 註冊乙個服務
bool civmdlgsrvmgr::regservice( string strsrvname, civmbasesrv* pprovider )
// 登出乙個服務
void civmdlgsrvmgr::unregservice( string strsrvname )
// 登出乙個服務提供者
void civmdlgsrvmgr::unregprovider( civmbasesrv* pprovider ) }
}// 請求乙個服務
//使用者需要呼叫另外乙個模組的服務函式時,呼叫該函式。前提是:另外乙個模組提供了這個服務函式,並向中心伺服器註冊了該函式,如何註冊,下面會做介紹。
bool civmdlgsrvmgr::queryservice(in civmmsg& msg, out civmmsg& result)
return psrvprovider->onquerymsg( msg, result ); }
// 註冊乙個視窗
void civmdlgsrvmgr::regdlg( civmbasesrv* pdlg )
// 登出乙個視窗
void civmdlgsrvmgr::unregdlg( civmbasesrv* pdlg ) }
}civmbasesrv* civmdlgsrvmgr::getregdlg( string strdlgclassname ) }
return null; }
void civmdlgsrvmgr::diableallwnd() }
}void civmdlgsrvmgr::enableallwnd() }
}//void civmdlgsrvmgr::closenonevideownd() }
}模組需要繼承乙個統一介面,向中心伺服器註冊自己提供的服務函式,和呼叫中心伺服器提供的介面來呼叫其他模組的函式。
基類定義:
////
服務類介面
class baseframe_class civmbasesrv;
~civmbasesrv(){};
// 服務響應函式
virtual bool onquerymsg( civmmsg& msg, civmmsg& result );
// 獲取提供的服務名列表
virtual bool getsrvlist( list& srvlist )
protected:
// 註冊自己的服務
virtual bool registthissrv()
} return bret; }
// 登出自己的服務
virtual void unregistthissrv()
};1.
模組要繼承基類
civmbasesrv 2.
在啟動模組時,呼叫
// 註冊視窗提供的服務
registthissrv();
並實現:
// 獲取提供的服務名列表
bool civmeqmaindlg::getsrvlist( list& srvlist )
srvlist.push_back( srv_eq_status );
srvlist.push_back( srv_eq_fresh );
srvlist.push_back( srv_eq_clear );
#ifdef _dianli_sms_
srvlist.push_back( srv_smtk_control_cycle );
#endif
return true;
}來注入自己提供的服務名稱。
3.實現自己提供的服務函式
4.//
服務響應函式
bool civmeqmaindlg::onquerymsg( civmmsg& msg, civmmsg& result )
else
} }
} else if ( strmsgname == srv_eq_fresh )
else if ( strmsgname == srv_eq_clear )
#ifdef _dianli_sms_
else if ( strmsgname == srv_smtk_control_cycle )
//判斷
action
的值來決定是啟動
smtk
還是關閉
smtk
if ( naction == 1 )//
喚醒電源系統
else if ( naction == 0) //
休眠電源系統 }
}#endif
else
return nrecid > 0 ? true : false; }
這樣其他模組就可以根據服務名字來呼叫該模組的服務函式。注意:
1.服務函式不能阻塞,否則會引起呼叫者的阻塞。
2.civmmsg
只是乙個
xml結構體,使用者可以自己實現。
3.呼叫服務函式的結果放在
, civmmsg& result
中。
Python學習之模組間互相呼叫方法詳解
本文和大家分享的主要是python 學習python有所幫助。問題在python 裡,假設我們有兩個模組,a,b,在模組 a中有檔案 a1,模組 b中有檔案 b1.結構如下 a a1 b b1那麼,在b1 檔案中呼叫 a1裡的方法,就會出現 import error 告訴我們找不到這個模組 解決方法...
lua對模組介面擴充套件的一種方法
lua中模組的實現,對於使用者來說就是乙個庫,引用此庫後,可以呼叫庫中實現的任意函式。使用庫,可以將一類功能相關的介面做封裝,並提供開放介面。參考 我們實現引用程式,往往要引用若干已經實現的庫檔案,這些庫大都是開源的,以此來加快應用開發程序 應用庫後,應用編碼中,會引用庫的一些api,例如會是 lf...
通過指標呼叫模板函式的一種方法
由於卡片的種類非常的多 100 為了對每種型別的卡片呼叫相應的處理函式,定義了乙個如下的函式模板 template int addcard const char pszcardstr,void base 可問題是怎麼獲得每個例項化後的模板函式的指標?查閱了大半天的資料,終於找到了一種可行的辦法 定義...