2012-04-25 13 views
2

こんにちは、私は非常にコールバック関数の使い方が分かりました。 簡単な例で親切に説明できますか。C++でのコールバック関数の使用方法

私のプロジェクトでは、特定のコールバック関数が突然呼び出しスタックにUser.dll!546383c()として表示される関数によって呼び出されていることがわかりました。

私はこのコールバックを誰が呼んでいるのか、いつ起こるのか、本当に混乱しています。

コールスタックはポイント(つまり、関数A()がB()を呼び出してC()など)を呼び出すと突然何かが発生し、User.dllの一部の関数がこの呼び出しを呼び出します。だから私は機能の緩いトラック。

誰でも親切に説明することができます。前もって感謝します。

+1

"User.dll!546383c()" - システムのデバッグシンボルを取得する必要があります。モジュールウィンドウを取得し、User32を右クリックして 'シンボルを読み込み'ます。 Microsoft Symbol Serverをセットアップする必要がありますが、ダウンロードする必要があります。その後、User32の中の関数の名前が表示され、これをより明白にする必要があります。 – Rup

答えて

2

こんにちは、私は非常にコールバック関数の使い方が分かりました。誰でも親切に簡単な例でそれを説明できますか。

これについて多くのことは言いません。コールバックは、クライアント/アプリケーションコードがイベントを処理できるようにするライブラリやシステムコードのためのメカニズムです。 、などの読み取りの完了やファイルからの書き込み、ネットワーク、キーボード/コンソールなど、いくつかのタイマー/アラーム

  • I/Oイベントの

    • 有効期限、たとえば、あなたはに関連するコールバックを持っているかもしれません(バッファサイズの制限に基づいて)読み込みまたは書き込み能力の変更、または新規/紛失接続
    • いくつかの非同期処理の完了(たとえば、別のスレッドがいくつかの計算を行っている)
    • 予期しないエラー一部の非同期処理
    • いくつかのプロセスを導く機会特定の状態(たとえば、特定のクライアントを受け入れるかどうかを決定します。その後、呼び出し元が非同期クライアント処理を切断または開始します)

    なぜ、user.dllがコールバックを行っているのか - 誰が知っていますか?あなたは、あなたのプログラムやそれが何をしているかについて何も教えていないのです。

    論理レベルでは、スレッドがエンキューされたメッセージをチェックする(多分待機するブロックさえも)まで、コールバックが実際にスレッドにディスパッチされないことがあります。前者は、イベントがC++プログラムの他の部分(オペレーティングシステムとハードウェアコールバック(Linux/UNIXでは "シグナル"など)に共通する部分で作成された場合に共通です。

  • 1

    単純に、コールバックは関数ポインタと似ています。これは、アプリケーション内の別の関数に報告する(コールバックする)関数を構成するために使用されます。 例この方法では、ボタンクリック、マウス移動、メニュー選択、メモリ内の2つのエンティティ間の一般的な双方向通信などのイベントを処理できます。

    コールバックをトリガーするユーザーは、ユーザー入力または他の通信イベントが発生した可能性があります。

    関連する問題