2016-12-30 7 views
0

私はここにC++クラスでラップしたいCライブラリを持っています。ライブラリは非同期で動作し、エラーハンドラを設定する必要があります。私はCライブラリの静的クラス関数にエラーハンドラをラップする方法を知っていますが、void *user_dataポインタのようなものに慣れています。thisを静的サンクからメンバ関数を呼び出すことができます。"this"へのポインタを持たないC++でのCライブラリコールバック

メンバー関数のコールバックを直接登録する方法はありますか?このライブラリにはいくつかのユーザーデータへのポインタがありませんか?

答えて

0

動作させるグローバル(または静的な)ローカルオブジェクトを認識している独自の静的関数でラップすることができます。必要に応じてこの関数を静的メソッドにすることもできますが、呼び出すオブジェクトを指定せずにオブジェクトに対してメソッドを呼び出すことはできません。

を編集してください:しばらく考えていると、多分方法があります。基本的に、スレッドIDによってインデックスされた状態の集合のグローバルコレクションを持つことによって、スレッドローカルストレージをエミュレートできます。各スレッドバインド状態のコレクション内では、呼び出しオブジェクトのスタック/キュー(データの処理方法に応じて)を保持できます。コールバックは、(コールバックが実行中のスレッドIDを認識しているため)格納されたキューを検索できます。これにより、単一スレッドのフレームワークに複数のデータストリームを強制的に動作させることができます。

+0

うん、そう思った。問題は、オブジェクトのインスタンスが1つしかない場合にのみ機能することです。 ( – Nidhoegger

+0

何が起こりますか?概念的には、実行時に入力を受けない関数は、コンパイル時にその "入力"をハードコードする必要があります。しかし、あなたが登録した人を気にしないコールバックを取得しているなら、あなたができる最良の方法は、独立したコールバックハンドラのプールを持つことです。 –

+0

ところで、あなたは問題を過度にしていないことを確認する必要があります。フレームワークはいくつかのグローバルステートデータ構造を事前登録することに依存していませんが、コールバックに直接渡すことはできませんが、フレームワーク内にグローバルステートが保持されていれば、コールバックが一度に1つずつ処理できるグローバルなデータ/キューのスタックを保持することができます。 –

関連する問題