問題タブ [signals2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
412 参照

c++ - コールバックが boost::signals2::signal から切断されたときにコードを実行する

短い: 切断を使用して接続したコールバックが切断されたときにコードを実行する方法はありconnectますか?

長い: 高価な複数のコールバックを持つクラスがあり、ユーザーが関心のあるコールバックのみを生成したい:

stop_callbackここで、シグナルにバインドされたすべてのコールバックが切断されたときに実行したいと考えています。

0 投票する
0 に答える
36 参照

signals2 - Signals2: テンプレート化されたパラメータを持つ信号

カメラクラスの基本クラスを設計しています。その意図は、シグナルを使用して、新しく利用可能なイメージをクライアントに通知することです。カメラには、8 ビットまたは 16 ビットのピクセルがある場合があります。私は次のようにそれらをテンプレート化しようとしています:

MSVS 2008 では、 からクラスを派生させるICamera<uint8_t>と、 の typedef にコンパイル エラーが発生しますslot_type。つまり、CaptureSig::slot_typeはその時点では定義されていません。

各派生クラスでシグナルとスロットを定義する以外に、これを超える方法はありますか?

更新: 実際には、問題を引き起こしているのはシグナルのパラメーターではなく、テンプレート内のシグナル定義の存在です。信号の署名が固定タイプに変更された場合、同じエラーが発生します。

0 投票する
2 に答える
646 参照

c++ - Boost::signals2 が無効なデータを渡す

私は約 20 年間 C/C++ 開発者をしていますが、テンプレートは常に私にとって弱点でした。C++11 および C++14 標準では、テンプレート プログラミングがますます便利になり、複雑になってきているため、演習を行って学習することにしました。私は適度に成功していますが、問題を抱えている問題があります。私は次のクラスを持っています:

このコードは、Linux の動的ライブラリである複数のモジュールをロードする大きなフレームワークに入る可能性があります。アイデアは、特定のモジュールが呼び出すことができるようにすることです。

コールバックは、署名 void(ParamTypes) を持つ関数、または署名 void(ParamTypes) を持つ関数に対する std::bind() の結果である可能性があります。

別のモジュールは、次を呼び出すことができます。

そして、consume_event を呼び出した各モジュールには、ParamValues で呼び出されるハンドラーがあります。

これは、次のようにカスタム クラスへの参照を渡す場合を除いて、ほとんどすべての場合に機能するようです。

この場合、信号に接続されている関数は 0xa を受信し、それを ip_stats_t & として処理しようとするとすぐにクラッシュします。

出力は次のとおりです。

更新: 上記のカスタム クラスだけでなく、参照によって任意の変数を渡すときにも同じことが行われることに気付きました。

さらに、 SSCCE の不変変数が機能するため、この質問にはSSCCEがないことに注意してください。作業コードが上記のフレームワークに配置されるまで、問題は発生しません。

Update2: ここでの本当の問題は、このデザインをどのように改善できるかということです。これは正しく動作しないだけでなく、構文的にも問題があります。それは醜く、エレガントではなく、本当に、私がやりたかったことを実行し、テンプレートの理解を深めたことを除いて、それについて良いことは何もありません.

Update3: これは、渡すデータ型とは何の関係もないことを 100% 確認しました。参照によって変数を渡すとスロットは参照のアドレスとして常に 0xa を受け取ります。これには std::strings や int も含まれます。任意の変数を値で渡すと、その値のコピー コンストラクターは最終的にコピー元の値の参照として 0xa を受け取ります。これは、モジュール A で作成されたシグナルからモジュール B のスロットを呼び出す場合にのみ発生します。

何か案は?ありがとう!

0 投票する
1 に答える
650 参照

c++ - ブースト信号 2 - スロットを渡して切断するときのエラー

ブーストシグナル2のドキュメントのように、切断するスロットを渡したい:

スロットを渡して切断する:このインターフェース モデルでは、sig.connect(typeof(sig)::slot_type(slot_func)) で接続されたスロットの切断は、sig.disconnect(slot_func) を介して実行されます。

...しかし、切断を呼び出すときにエラーが発生しました(http://cpp.sh/45q6を参照):

エラー: 'operator==' のあいまいなオーバーロード
(オペランドの型は 'boost::signals2::slot >::slot_function_type {aka boost::function}'
および 'const boost::function' です)

私は何を間違っていますか?

0 投票する
1 に答える
192 参照

c++ - ブースト信号参照オブジェクトは範囲外ですか?

以前の boost::bind によって返された一時オブジェクトは範囲外になり、破棄されますが、一時オブジェクトは参照によって AAA::Connect に渡されます。ある時点で、オブジェクト a.FireSignal() が呼び出されたとしましょう。シグナルは、既に破棄されている関数オブジェクトを呼び出しますか? それ以外の場合はどのように機能しますか?