2012-02-11 3 views
0

私はboost_threadsを使用してスレッドセーフなキューと関数呼び出しを使用して自分自身をロールバックしています。しかし、Qtの信号とスロットのイディオムは、いくつかの点では本当に役に立ちますが、他の点では役に立たないようです。たとえば、名前付きパイプの場合、非同期通信を行うのは素晴らしい方法です。Qtスレッドを使用し、大きなオブジェクトをスレッド間で渡します。私は間違っているだけですか?

これは、変換する名前付きパイプで受け取ったオブジェクトを渡してから、別のスレッドに送信してデータを変換して送信するまでです。

私が気づいた最大の問題は、これらのメッセージを シグナルとスロットのメカニズムを介して、あるいはQMetaObject :: invokeMethod()を使用して前後に送信することです。これは、キューされた接続を使用して送信されるように思えますし、正しく理解していれば、渡されているオブジェクトを参照またはポインタで渡す代わりにコピーします。

これは多くのことが起こると本当に非効率になるようです。私の場合はそうなるでしょう。私はこの問題に近づくべき別の方法がありますか?

ただの方法がありますかオブジェクトを別のスレッドの参照またはポインタによってキューに挿入しますか?

+0

熟練者ではありませんが、(SSCCEの方法では、http://sscce.org/を参照してください)いくつかのコードを与えると、役に立つ回答を得るチャンスが劇的に増加します。 – posdef

+0

データのコピーを避けたい場合は、信号/スロット接続を介してデータへのポインタを渡すことができます。しかし、プロセスの境界を越えて信号やスロットをどのように使用するのか、私は本当に理解していません。 – cgmb

答えて

0

値渡しのコピーをエスケープするためにポインタを渡すことができるようです。また、boost :: shared_ptrを使用することが推奨されているので、それ自体が削除されることがあります。私はこれが他の誰かを助けることを望む。

1

プロセス間をやりとりする場合は、データをコピーする(つまり、プロセスの境界を超えてマーシャリングする)か、両方のプロセスがアクセスできる共通の場所に配置する必要があります。通常は後者を共有メモリで行い、所有権に注意してください。

+0

ご返信ありがとうございます。私の元々の質問は十分ではなかった。私の問題はプロセス間ではなく、スレッド間を行き来しています。私がQtでスレッド間を渡すことを読んだものは、参照やポインタを渡す代わりにコピーを行います。これは非効率的で、間違った方法です。 –

関連する問題