問題タブ [boost-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.
c++ - ファンクターによるブースト信号 2 接続の切断
Boost.Signals2 を使用するために、別のシステムを使用するコードを変換しようとしています。古いコードでは、通常の関数ポインターをファンクターとして使用していました。接続はファンクターで特定のメソッドを呼び出すことによって行われ、切断はまったく同じファンクターで別のメソッドを呼び出すことによって行われました。Signals2 で最も効率的な方法ではないことはわかっていますが、互換性の理由から、これを引き続きサポートしたいと考えています。
上記の (簡略化された) コードは接続に対して正常に機能しますが、Unregister メソッドは VS2008 でコンパイルされません。
では、どういうわけか、関数オブジェクトをそれ自体と比較することはできませんか? また、UpdateCallback に slot_function_type を使用してみました。また、同じシグネチャを持つ boost::function として明示的に指定しました。どちらも代わりにこのエラーを生成しました:
ですから、選択肢が少なすぎるものから多すぎるものになったと思います。これを解決するにはどうすればよいですか?
c++ - C++テンプレートパラメータの控除が機能していません
との間の接続をオーバーライドする必要がありboost::signals2::signal
ますboost::function
。この目的のために、次のテンプレート関数を作成しました。
bind
これをできるだけシンプルに活用したいと思います。同様の問題に関する投稿で読んだことから、テンプレートパラメータは関数の引数から推測する必要があります。しかし、私の場合、明示的なパラメーターがない場合、それは機能していません。
私は何かが足りないのですか?
明示的なテンプレートパラメータを回避するための回避策はありますか?
c++ - ジェネリック関数/スロットでブースト::シグナルに接続する方法は?
特定の署名を期待する Boost::Signal に異なる署名を持つ関数を接続することは可能ですか?
私は(さまざまな署名の)多くの信号を持っており、そのモジュールの外側から、信号の署名を気にせずに信号を観察できるようにしたいと考えています。それは可能ですか?
例:
Boost::Bind を使用してそれを行うことは可能ですか?
使用ブーストバージョン:1.46.1
私が使用する場合
次のエラーが表示されます。
どうもありがとう。
boost - このboost::lambda :: bindの使用法の何が問題になっていますか?
このコードに何か問題がありますか?コンパイルエラーが発生し続けます。基本的に、ボイドリターン関数を非ボイドリターンタイプのシグナルに接続したいと思います。ブーストバージョン:リリース1.46.1
コンパイル中に次のエラーが発生します。
ありがとう。
c++ - DOS コマンドラインで bootstrap.bat がクラッシュする
同僚のブースト ディレクトリをコピーしました。箱から出してそのままで問題なく動いていました。
しかし、今問題があります.boost.signalsを使用した新しいコードはうまくコンパイルできますが、binディレクトリにファイルがないためリンクしません。libboost_signals-vc100-mt-gd-1_48.lib
(私はすでにスレッド、正規表現、およびその他のライブラリバイナリをいくつか持っていますが、シグナルは持っていません)。
そこで、 Boost.Signals2 をビルドするためにBoost Install 手順を調べ始めました。
また、Boost.Build をインストールするか、Boost.Signals2 をビルドするかに関係なく、バッチ スクリプトのbootstraps.batにより、MS-DOS コマンド ウィンドウがエラー メッセージなしでクラッシュします。「Bootstraping the build engine」または「Bootstraping Boost.Build engine」を書いた後、約 10 秒かかります。
また
どこから調査を開始すればよいかわかりません。何か案が ?明らかなことを忘れましたか?
c++ - Boost Signal2 での Visual Studio 2012 C++ コンパイル エラー
次の Boost Signals2 コードで Visual Studio 2012 Ultimate を使用しています: https://github.com/cfobel/boost_signals2/blob/master/hello_world_0.cpp で、次のエラーが生成されます。
このコードは Visual Studio 2012 C++ と互換性がありませんか? まだ安全に使用できますか?最後に、提案どおりに変更するにはどうすればよいですか? ありがとう
signals-slots - Boost.Signals2 で Hypodermic を使用する
Boost.Signals2 を Hypodermic で使用するには、どのようにスロットを接続すればよいですか? OnActivating ブロック内に接続コードを配置しますか?
Hypodermic は Signals2 で構築されていますが、お互いの機能が重複していないと考えるのは正しいですか?
c++ - Boost::signals2 - スロットを持つオブジェクトの説明
このことを考慮:
出力は「Slot called!」です。クラッシュも何もありません。そのため、いくつか質問があります。
1) クラッシュしないのはなぜですか?
2) スロット関数が存在しないオブジェクトに何かを割り当ててもクラッシュしないのはなぜですか?
3) 信号がスロットの有効期間を自動的に追跡するようにするにはどうすればよいですか? つまり、スロットが破壊されると、切断されます。
質問番号 3 が最も重要です。オブザーバー パターンを実装する必要があり、オブザーバー (スロット) の有効期間が (アプリの実行中ずっと) 静的ではないことが非常に多いためです。
c++ - sigabrt を引き起こすデストラクタ中のブースト信号
boost::signals2 を使用してオブジェクト破壊の追跡を開始しました。ここで、デストラクタでまだシグナルを使用できるかどうかを確認するためだけに、小さなテストを作成しました。うまくいったようです。その後、他のオブジェクトを参照するオブジェクトのリストを追跡するために使用し始めました。私の構造は多かれ少なかれそうです:
構造の簡略図: http://oi50.tinypic.com/16c8cwn.jpg
IModel と IBlock の 2 つのクラスがあります。IModel には多くの IBlock があり、IBlock には IModel の親があります。ただし、IModelBlock と呼ばれる特別な IBlock があります。このブロックには、親に加えて参照される IModel があります。これは、IModel 間の「コネクタ」のようなものです。どの IModel がそれらを使用しているかを IModel に知らせたかったので、どのモデルが別のモデルを使用しているかを追跡するために、IModel と IBlock の破棄中に発生するシグナルを使用する参照カウント システムを実装しました。
IBlock の純粋な仮想クラスがあります (明らかにデストラクタを除く):
私の IModelBlock ヘッダー (純粋な仮想クラス):
私の IModel ヘッダー (純粋な仮想クラス):
使用されていることをモデルに通知する IModelBlock コンストラクター (ModelBlock クラス) の私の実装:
ここが毛むくじゃらです
私の IModel (モデル) の実装では、次のように定義されています。
これが何が起こるかです
ModelBlocks を使用して内部にネストされたモデルを含む一連のモデルを作成すると、すべてがうまく機能します。ただし、破壊に関するいくつかの問題が予想されたので、巨大なセグメンテーション違反に備えました...決して起こりませんでした。代わりに、すべてのモデル (およびそのすべてのブロック) に破壊フェーズを開始させたときModel::onModelBlockDestroying
、最初のif
. コンソールを見ると、pure virtual method called
. このエラーは今まで見たことがないので、修正方法がわかりません。
スタック トレースは、~IBlock デストラクタを呼び出していてsigBlockDestroying
、10 関数レベルの後に最終的に関数を呼び出したシグナルを発行したことを示していonModelBlockDestroying
ます。ここで、Model が破棄されていれば、そのシグナルはすべて切断されているはずであり ( を参照~Model
)、sigBlockDestroying は何も呼び出さなかったはずです。したがって、~IBlock デストラクタが呼び出されたときにモデルがまだ存在していて、オブジェクトがまだ有効であると結論付けることができます。明らかに問題があるため、この仮定が間違っていることは 99.9% 確信していますが、なぜそれが起こっているのか、どのように修正するのかはわかりません。上記のコードがたくさんあることは知っていますが、どこが間違っているのか誰かわかりますか?
編集: に渡された IBlock* のメンバー関数を呼び出すことに関係しているように感じますonModelBlockDestroying
が、オブジェクトはまだ消えていません (ただし、実際の実装のデストラクタを既に通過しているため、残っているだけです)呼び出しに純粋な仮想を使用)。それが起こっていることですか?デストラクタが ~IBlock にあるため、ツリーのはるか下に到達するまでに、~ModelBlock のデストラクタが既に呼び出されているため、実装されているすべての関数にアクセスできなくなりますか?
十分に説明できなかった場合は、お知らせください。明確にします。