それらのもののコールバック関数(転載)

https://www.cnblogs.com/ioleon13/archive/2010/03/02/1676621.html

コールバック関数のための実用的な作業がされている私は、別のカテゴリのポインタを含むことによって、多くの人々のために技術を理解することは困難である非常に深い謎を行う何かに触れ、そして第二に、一般的にはしたくありません問題を解決することができるので、彼らは、プロジェクトマネージャは、コールバック関数を使用するように強制され、そして実際に企業が有利になり、最近、クラスのコードとの間の関係は非常に複雑ではないこのようなものを勉強したくありませんクラスは、クラスBは、Bで定義されたポインタを必要としなくなりまし事を伝えたかったん、あなたはコールバック関数を定義することができます。あなたは観客がそれを理解することができる私は、次の書き込みコールバック関数を理解して、レンガを投げ、1つの味あなたはもっと練習をしたいです。

1、基本

モジュールBのB()の完全な特定の機能は、機能モジュールを介して、いわゆる補正が、関数b()が完了するのモジュールA()内の関数を呼び出すために限り必要と完全な機能性を達成することができませんこのAは()コールバック関数です。下記に示すように、

 

①は、インタフェース仕様を合意しました。インターフェース仕様はモジュールBで合意されなければならない、コールバック関数を()関数のプロトタイプが定義されています

コールバック関数のプロトタイプは、typedefを無効(* SCT_XXX)(LPVOID LP、constのCBParamStruct&cbNode)従うことが最善である、本明細書に定義される; SCT_XXXコールバック関数名を、LPは、コールバックパラメータに一般的に起因するコールバック・コンテキスト、CBParamStructコールバックパラメータは、そう、複数のです便利な構造の定義。

②登録されたコールバック関数。彼らは、使用するつもりだった知っているコールバック関数モジュールBためには、コールバック関数を登録する機能またはステートメントがなければなりません

登録は、コールバック関数がボイドRCF_XXX(SCT_XXX PFN、LPVOID LP)を、以下に定義される; RCF_XXX関数の登録名であり、PFNは、コールバック関数名(ポインタ)であり、LPは、コールバックコンテキストです。モジュール概して完全な初期化モジュールBがPFNにモジュールAで定義されたコールバック関数アドレス割り当てを呼び出した後、LP割当てはこれです。 

モジュールAで物事を行う③:

まず、コールバック関数は、静的、静的ボイドCF_XXX(LPVOID LP、CONST CBParamStruct&cbNode)として宣言され、パラメータの関数がコールバックパラメータモジュールBの関数プロトタイプと一致しなければなりません。

B初期化モジュールは、Aレジスタ機能モジュールアドレスを呼び出しCF_XXXコールバック関数PFN、すなわちPFN = CF_XXXに渡さ宣言;(CF_XXX関数名は、実際に、コールバック関数のアドレスへのポインタです)。

 2、例えば

MFCインターフェイスのプログラミング:コールバック関数は、最初のシーンを使用しています。このような要求があり、左の主なインタフェースは、ツリーリストで、プロット領域の右側には、編集用の左側、ダブルポップアップ描画領域にコンテンツ項目のリストを表示するために使用されます。一般的には、描画領域にボックスを扱うイベントをダブルクリック機能の完了でポインタのうち、リストまたはツリー内のメインイベントを呼び出し、ダイアログが初期化され、メインダイアログまたはツリーに渡された描画領域リストポインタであります更新操作。メインダイアログクラスとクラス描画領域間のこのような対話は、相互に関連してそこに含まれており、コールバック関数が、この時間を繁栄することができ、メインダイアログボックスは、ヘッダファイルのプロットエリアを含む描画領域ダイアログを宣言する必要がありますオブジェクトをすることができます。具体的に:描画領域]ダイアログのコールバック関数のプロトタイプと登録したコールバックでの定義、およびマウスのダブルクリックイベントを処理するには、イベントのコールバック関数に通知を発行しました。プロトタイプで定義されたメインダイアログのコールバック関数は、コールバック関数の中でツリーリストの更新を完了します。

2番目のシナリオコールバック関数:ネットワークプログラミング。ネットワークプログラミングは、すなわち通信およびデータ処理部門オープン、一般にモジュラーを反映するために、通信プロトコルモジュールは、定義、データ送受信を担当して、データ処理モジュールは、通信モジュールが開いた場合にのみ、解析され、パッケージ化されたデータの送受信を担当してスレッドは継続的にデータを受信し、この時間は、質問は、それはそれの手の中にデータ処理モジュールによって送信されたデータに何を意味するのか、ですか?たびにデータが受信され、データが別の2つのエラークラスのポインタポイントがなされるように、操作を完了するために、関連する処理モジュールへのポインタを取得するだけでなく、二つのモジュールの独立性を破壊します。これらの問題は、次の擬似コードは、一部を与えられて、解決されるコールバックを使用します。

通信モジュール
(* DataReceiveCBFunc)(ReceiveParam&recvParam)のtypedefを無効; //  コールバック関数のプロトタイプが定義されています  
 
// 开始接收,数据处理模块调用,相对于注册回调函数
static BOOL StartReceive(DataReceiveCBFunc pfnData, LPVOID lpContext,……);
// 接收数据的线程,一收到数据就通知回调
static UINT TH_Receive(LPVOID lp);

 

 
数据处理模块
// 开始接收数据,开启监听线程,调用上面的StartReceive函数
int StartReceiveInfo(int nListenPort, std::string strLocalIP);
// 数据接收回调函数,被CUdpEx::TH_Receive()回调
static void RecvInfoCallback(ReceiveParam &recvParam);  

おすすめ

転載: www.cnblogs.com/CodeWorkerLiMing/p/11221723.html
おすすめ