問題タブ [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++ - これはブースト信号を使用するための正しく適切な方法ですか?
MVC アプリケーションを作成していますが、モデルが出力テキストを GUI に送信して表示できるようにする方法が必要です。
関数ポインターを推奨する人もいますが、メンバー関数の関数ポインターを渡す場合は、オブジェクトへのポインターも渡す必要があることを学びました (メソッドを呼び出すことができるように、オブジェクトポインターだけを渡さないのはなぜですか? )
とにかく、boost::signals2 の使用も推奨されています。非常に単純な実例を実装しました。基本的に、信号を GUI オブジェクトの関数にバインドします。次に、シグナルへのポインターを、シグナルをトリガーできるオブジェクトに渡します。以下のコードを参照してください...
私は信号の完全な初心者であるため、それらを使用することを意図しているため、それらを使用しているかどうかは完全にはわかりません.
c++ - シグナル コールバックを渡す方法 (boost::bind を使用)
boost::signals2::signal
よりクリーンで使いやすいインターフェイスを実現するためのラッパーを作成しています。これが私が思いついたものです:
これが私が思いつく最高のラッパー インターフェースかどうかはわかりません。SomethingHappened をパブリック メンバーにすることには、おそらくいくつかの欠点があるかもしれません。それについてあなたの意見を聞いてもかまいませんが、それはこれが質問の内容ではありません.
私が疑問に思っているのは、コールバックを+=
オペレーターに渡す方法です。ClassThatListensForEvents
関数へのコールバックで書いたように問題はありませんが、結果bind
を使用すると、読みにくいテンプレート コンパイラ エラーが大量に発生します。
c++ - enable_shared_from_this が埋め込みの weak_ptr に直接アクセスできないのはなぜですか?
マルチスレッド アプリケーションで、自動接続管理でブースト シグナル 2 を使用したいと考えています。私のクラスはから継承してenable_shared_from_this<>
おり、別のメンバー メソッド内からメンバー メソッドを接続したいと考えています。接続は頻繁に再構築される可能性があるため、コードは可能な限り高速にする必要があります (ブースト signal2 のパフォーマンス自体にもかかわらず):
私の設計目標が矛盾している可能性があることは知っていますが(自動接続管理とスレッドセーフだけでなく、高速コードも)、とにかく:
enable_shared_from_this<>
組み込みへの直接アクセスが欠けているのはなぜweak_ptr<>
ですか? 反対する理由が見当たりません。私のようなユースケースはありませんか?上記よりも速い回避策はありますか?
編集:
私はこのように考えられることを知っていますが、追加のストレージ/初期化チェックのペナルティを避けたいです:
c++ - なぜ boost::signals2::signal なのか::接続にはコピーコンストラクターが必要ですか?
私は、依存値が変更されたときに値を変更する機能的リアクティブプログラミングを利用する通常のデータ値を表すオブジェクトに取り組んでいます。つまり、var3 = var1 + var2; があるとしましょう。var1 の値を変更すると、var3 の値が自動的に更新されます。C++ ではこれは大変ですが、更新関数が別のワーカー スレッドのどこかで呼び出されているため、機能的に反応しているように見せることができます。
そこで、私の方法を以下に示しました。任意の型を持つことができる Reactive と呼ばれるテンプレート オブジェクトを作成し、演算子をオーバーロードして、これらのリアクティブのうちの 2 つを加算すると、結果の値がそれらの合計に等しいだけでなく、ラムダがこれは操作を std::function に格納します。これは、更新関数を呼び出したときにいつでも結果の値を更新するために後で再度呼び出すことができます。
いくつかの問題が発生します。依存する値の 1 つが破棄された場合はどうなりますか。結果として得られる Reactive には、有効なラムダであると見なされるものがまだありますが、ラムダが使用した引数は存在しなくなります。これを説明するために、boost::signals2 を使用してシグナルとスロットのシステムをセットアップし、依存関係のいずれかが破壊されたことを結果に通知します。結果がシグナルを受信すると、そのアフェクター関数は無効になり、更新時に呼び出されません。
リアクティブがその + 操作を実行できるようにするには、一時的なリアクティブを作成する必要があります。これには独自のシグナルがあり、次に = 演算子をオーバーロードして、一時的なデータを結果のリアクティブに移動する必要があります。ただし、シグナルはコピーできません。私は std::unique_ptr に destruct シグナルを含めることでこれを回避し、オペレーター = Reactive && を受け取ったときに std::move を使用しました。危機は回避されました。
ここで私は立ち往生しています。後で気がついたのですが、move の構築は問題なく実行できましたが、Reactive の 1 つをコピーして構築する方法がまだないことに気付きました。そして、次のようにします: var4 = var3; 次に、どうにかして var1 と var2 の破壊シグナルは、それらが破壊されたことを var4 に通知する方法を必要とします。私が最終的に思いついたのは、boost::signals2::signal を含むファンクタである Proxy というサブオブジェクトを設定し、各オブジェクトが std::shared_ptr に含まれるようにすることでした。 . Reactive がそのプロキシへの参照を持っている場合、inform destruct メソッドをそのプロキシに接続します。次に、依存関係がそのプロキシに信号を添付します。プロキシが呼び出されると、すべての接続も呼び出されます。
問題は、プロキシを依存信号に接続するには、プロキシにコピーコンストラクターが必要であるか、少なくとも msvc が私に与えているエラーです。どうやら boost::signals2::signal::connect はそのコピー コンストラクターを使用しますが、プロキシ自体にシグナルが含まれているため使用できません。これが最善の解決策かどうかまだわからないので、このすべての情報を提供します。私はシグナルとスロットに最も精通しているため、シグナルとスロットを選択しましたが、より良い解決策があれば指摘してください。それ以外の場合は、このエラーを回避してください。
ところで、Slot は、Unreact() 関数を各 Reactive に固有のファンクターにする方法にすぎません。
オブジェクトは次のとおりです。
そして簡単なテスト
ここに警告/エラーがあります:
c++ - 汎用スロットのライフタイム管理を備えた boost::signals2 のラッパー
スロットにシグナルを送信するモジュール (スレッド) 用の boost::signals2 のラッパー クラスを作成したいと考えています。つまり、モジュールは Signal クラスから継承することによって、典型的な単純なシグナル機能 (例えば public connect(...) メソッド) を取得する必要があります。また、使用されている実際のシグナルスロットの実装も隠したいと思います。
具体的なスロットは、その署名を定義するテンプレート パラメーターを持つ汎用スロット基本クラスから継承します。スロットは、適切なシグネチャを持つ単なるファンクタです。
この質問は、この質問に多少関連しています。スロットは shared_ptr として保存され、ライフタイム管理が必要です。つまり、Signal クラスは、シグナル自体が存在する限りスロットを存続させるために、スロットへの参照を保持する必要があります。したがって、std::functions などに接続できません。スロット基本クラスの shared_ptrs を接続する必要があります。
これまでのところスレッドセーフなしの私の現在のアプローチ(MSVC 2010):
このコード (バージョン A) はコンパイルされません。これは、boostslot_template.hpp 内と、connectSlot メソッドでマークされた行で中断されます。
興味深いことに、代わりにバージョン B を使用すると、このコードはコンパイルおよび実行されます。つまり、boost::ref がスロットに渡されます。コンパイラの警告がありますが、「安全でない可能性のあるパラメーターを使用した関数呼び出し - この呼び出しは、渡された値が正しいことを確認するために呼び出し元に依存しています。」ブーストのsingals2 auto_buffer.hppで。
では、ここでの実際の問題とその解決方法は何ですか? なぜこれは boost::ref で動作し、それなしではコンパイルできないのはなぜですか?
デザインのアイデア全体が役に立つかどうかさえ確信が持てません。当初のアイデアは、スーパークラスにシグナリング/スロット全体を隠し、署名に焦点を当てる (そしてライフタイム管理を含める) ことでした。
ブーストの signal2 に関する追加の質問: singals2 connect() メソッドはスロットへの参照を取ります。これは内部でどのように処理されますか。接続されたスロットの参照を使用しますか、それともスロットのコピーを作成しますか? 私のスロットは動的に割り当てられたメモリを処理するため、これは重要です。
c++ - テンプレート内の2つの異なるクラスの2つの関数を接続するC++ブースト信号
あるクラスの関数を接続して、別のクラスで呼び出せるようにしようとしています。私が見つけた答えは具体的すぎるか、何かが欠けているのかもしれません。また、私はboostライブラリに少し慣れていないので、私が尋ねるかもしれない愚かな質問を許してください.
私のワークフローのセットアップは基本的にこれです...
基本的に、 addlistener 関数はシグナルと関数を結び付けません。どうすればいいのかわからないところで何か間違ったことをしていることは知っていますが、何が間違っているのかわかりません。これをヘルパー関数として作成しているため、あるクラスから別のクラスに関数を渡し、それらがアタッチされたときにそれらを呼び出すことができます。WebSocket 接続からドミノ イベントを作成しようとしていますが、非常に重要なものが明らかに欠けています。どんな助けでも本当に感謝します。
私はxcodeとboostとmacbook proを使っています。