模組間互相呼叫的一種方法

2021-04-29 21:56:21 字數 3117 閱讀 4038

模組間互相呼叫的一種方法

在程式設計中,需要把程式根據功能劃分多個模組,多個模組間免不了互相呼叫一些服務函式,這樣會使模組間剪不斷,理還亂!

利用服務中心的思想,可以使各個模組間的關係比較簡單。模組間的呼叫通過中心伺服器交換,彼此沒有聯絡,這樣模組間可以到達低耦合,高內聚。

實現方法:

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 可問題是怎麼獲得每個例項化後的模板函式的指標?查閱了大半天的資料,終於找到了一種可行的辦法 定義...