問題タブ [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.

0 投票する
5 に答える
4372 参照

c++ - boost::signals2 のスロットの強制削除

boost::signals2 は、接続されたスロットの遅延削除のようなものを使用しているため、接続をオブジェクトの有効期間を管理するものとして使用することが難しくなっていることがわかりました。切断されたときにスロットを強制的に直接削除する方法を探しています。コードを別の方法で設計して問題を回避する方法についてのアイデアも大歓迎です!

これが私のシナリオです。非同期に時間がかかる処理を担当する Command クラスがあり、次のようになります (簡略化)。

クラスは次のように呼び出されます。

Command クラスは、boost::bind を使用して ActualWorker シグナルにバインドされた shared_ptr をそれ自体に取得することによって、自身を存続させます。

ワーカーが完了すると、Command のハンドラーが呼び出されます。ここで、Command オブジェクトを破棄したいので、上記のコードに見られるように、シグナルから切断します。問題は、切断時に実際のスロット オブジェクトが削除されず、無効としてマークされ、後で削除されることです。これは、再び発火する信号に依存しているように見えますが、私の場合はそうではなく、スロットが期限切れになることはありません。したがって、boost::bind オブジェクトはスコープから外れることはなく、削除されることのないオブジェクトへの shared_ptr を保持します。

これを回避するには、shared_ptr の代わりに this ポインターを使用してバインドし、メンバー shared_ptr を使用してオブジェクトを存続させてから、ハンドラー関数で解放しますが、設計が少し複雑すぎるように感じます。切断時にsignals2に強制的にスロットを削除させる方法はありますか? または、デザインを簡素化するために他にできることはありますか?

どんなコメントでも大歓迎です!

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

c++ - 信号とスレッド-設計の決定は良いか悪いか?

非常に計算量の多い計算を実行するプログラムを作成する必要があります。プログラムは数日間実行される場合があります。計算は、共有データを必要とせずに、さまざまなスレッドで簡単に分離できます。現在のステータスを通知するGUIまたはWebサービスが必要です。

私の現在の設計では、BOOST::signals2とBOOST::threadを使用しています。コンパイルされ、これまでのところ期待どおりに機能します。スレッドが1回の反復を終了し、新しいデータが利用可能な場合、GUIクラスのスロットに接続されているシグナルを呼び出します。

私の質問:

  • この信号とスレッドの組み合わせは賢明なアイデアですか?私は別のフォーラムで、誰かが「この道を進んで」はいけないと誰かにアドバイスしました。
  • 私が見落とした潜在的な致命的な落とし穴が近くにありますか?
  • GUIクラスを使用してWebインターフェイスやQT、VTKなどのウィンドウを提供するのが「簡単」になるという私の期待は現実的ですか?
  • 私が見落としていた(他のブーストライブラリのような)より賢い代替手段はありますか?

次のコードはでコンパイルされます

コードは次のとおりです。

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

c++ - boost.signals2 との相互作用の問題?

boost::asio::io_service によって呼び出される関数内から、booost::asio::async_read の後にシグナルを呼び出そうとしています。run 関数はスレッドで実行され、オブザーバーは別のスレッドで接続されます。

これにより、エラーが発生しています。それは私のプログラムですか、それとも io_service::run から別のスレッドで実行されているハンドラーを呼び出すことはできませんか? つまり、別のスレッドからのシグナルを呼び出すハンドラ呼び出しのスレッド間通信は可能ですか? 前もって感謝します。

0 投票する
4 に答える
1363 参照

c++ - Boost :: Signalsのポイントは何ですか?

まず、私はプログラミングの初心者なので、あまりからかわないでください。
シグナルが使用されているのを見たのはGUIツールキットだけで、GUIツールキットにはすべて独自のシグナルが付属しています。では、Boost:SignalsはこれらのGUIツールキットでも使用できますか?これは良い考えでしょうか?信号には他にどのようなアプリケーションがありますか?

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

c++ - ブースト信号のコンパイルの問題 2

この簡単な例がコンパイルされないのはなぜですか? また、どうすれば問題を回避できますか?

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

c++ - Boost::signals2::signal::connect のプロトタイプは何ですか

signal2::signal オブジェクトをカプセル化し、connect および operator() 関数を公開したいのですが、それらのプロトタイプはどのように見えますか?

例:

TYPE1 と TYPE2 の正しい型を表す方法は、SIG_T::??? のようなものだと思います。

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

c++ - boost::signals2 で多数のシグナル/スロットの接続/切断を処理する

古いシグナル コードの代わりに、boost::signals2 の使用を開始しました。ただし、複数の接続の管理に問題があります。これが私の問題です:

私はクラス Person の多くのインスタンスを持っています:

また、使用可能なすべての人のサブセットの変更を監視するピープル ブラウザーもあります。人々はそのサブセットに出入りできるので、接続オブジェクトを処理する方法が必要であり、それを処理するクラス (ConnectionList) を作成しました。

これで問題ありません。PeopleBrowser が削除されると接続が切断され、新しい接続を追加する良い方法があります。

ただし、別のメソッド、RemovePerson を追加する必要があり、そのメソッドはその Person インスタンスの NameChange シグナルへの接続を削除する必要があります。

これは私が立ち往生しているところです。ConnectionList をテンプレートにして、信号と接続への参照を持つ構造体を保持するリストを使用し、その信号へのすべての接続をドロップするメソッドを追加できると思います。

しかし、これは非常に一般的なケースのようです (少なくとも私の世界では、この機能を必要とするこの 1 つのアプリに 20 個のクラスがあります)。

少なくとも、接続オブジェクトから接続された信号への参照を取得する方法はありますか?

おそらくlibsigc ++はこれをより適切に/異なる方法で処理しますか?

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

c++ - boost.signals2ライブラリを構築する必要がありますか?

私のシステムはブーストライブラリの構築に問題があります。ほとんどのBoostライブラリは(幸いなことに)ビルドする必要のない単なるヘッダーであることを理解しています(一部の例外を除く)。ブースト::signals2ライブラリを構築する必要がありますか?また、boost.signals2ライブラリはboost.signalsライブラリに依存していますか?

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

c++ - c++ブーストシグナル2

c#には、それを宣言したクラスからのみ呼び出すことができる特別な種類のデリゲートであるeventキーワードがあります。それで、boost :: signal2を使用してネイティブC++でこれを行う方法はありますか?もしそうなら、パフォーマンスの観点からそれは高価ですか?

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

c++ - 例外なくブースト信号 2 の信号伝搬をキャンセルする方法はありますか?

boost::signals2C++ アプリでイベント通知を処理するために使用したいと思います。ブラウザー DOM イベントと同様の機能を実装したいと考えています。具体的には、イベントの伝播を停止して、現在のレシーバーがシグナルについて知る最後のレシーバーになり、後続のレシーバーが呼び出されないようにする機能です。(これがブラウザーでどのように機能するかについて詳しくは、 http://www.w3.org/TR/DOM-Level-3-Events/#events-event-type-stopImmediatePropagationを参照してください)

と呼ばれる信号を持つ仮想AppクラスがありthingHappenedます。通知を受信するさまざまなタイプの他のクラスがAppいくつかあるため、インスタンスは1 つしかない可能性があります。他の に通知されないように、ウィジェットが を消費 (停止) したい場合があります。WidgetconnectthingHappenedThingEventThingEventWidget

最初は a でこれを達成できるかどうか疑問に思っていましたshared_connection_blockが、これは一度に 1 つの接続しか抑制しないことがわかりました。最初にシグナルに a を渡しましたshared_ptr<ThingEvent>が、シグナルが呼び出されると、その伝播に介入する方法がありませんでした。shared_ptr を渡すと、シグナル レシーバーがイベントの値をチェックし、設定されている場合は返すことができますが、その詳細をライブラリのユーザーにプッシュしたくありません。

私が見つけた解決策はThingEvent、スタックに a を渡して、各レシーバーにコピーされるようにすることです。イベントを設定mStopPropagationすると、イベントが破棄されたときに例外がスローされ、シグナル呼び出しが終了します。これの欠点は、シグナルが呼び出された時点で独自の try/catch が必要なことです。スタイル的にはexception、例外的な目的で を使用していることを意味します。より良い方法はありますか?

これが私の架空のAppクラスで、信号がありますthingHappened

イベントに関するいくつかのデータ(タイプなど)と、デストラクタで設定されている場合に例外がスローされるプロパティを含む私ThingEventのクラス:mStopPropagation

タイプがの場合Widgetに を呼び出すサンプル シグナル コンシューマ a を次に示します。stopPropagation()event"goat"

最後に、main()これらのクラスを使用する簡単な関数を次に示します。

手にブーストがあり (私は 1.44 を使用しています)、それをコンパイルしたい場合、完全なコードと Makefile はhttps://gist.github.com/1445230にあります。